首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IxSet中的文本索引

IxSet中的文本索引
EN

Stack Overflow用户
提问于 2013-01-20 12:20:18
回答 1查看 250关注 0票数 4

我似乎不明白IxSet中的文本索引是如何工作的。在这里,我创建了一个单元测试,它通过tags字段对项目进行索引,然后通过标记" tag“查询项目。它应该(从我的角度)返回所有3个项目(因为它们都有标签" tag "),但它们似乎没有。我不明白为什么。

代码语言:javascript
复制
{-# LANGUAGE DeriveDataTypeable #-}

import Test.HUnit
import Data.IxSet
import Data.List.Split ( splitOn )
import Data.Data ( Data, Typeable )

data TaggedItem = TaggedItem { getTags :: String }
                  deriving ( Show, Ord, Eq, Data, Typeable )

data Tag = Tag String
           deriving ( Show, Ord, Eq, Data, Typeable )

getTagStrings :: TaggedItem -> [Tag]
getTagStrings = map Tag . splitOn "," . getTags

instance Indexable TaggedItem where
  empty = ixSet
            [ ixFun getTagStrings ]

test3 = TestCase (
  assertEqual "ixFun multiple tags test"
  3
  (size (index @= (Tag "tag"))) )
  where items = [ TaggedItem "tag,tag1,tag2"
                , TaggedItem "tag,tag1,tag2"
                , TaggedItem "tag,tag1,tag2" ]
        index = fromList items

tests = TestList [
  -- TestLabel "test1" test1,
  -- TestLabel "test2" test2,
  TestLabel "test3" test3]

main = do
  runTestTT tests

更新:

嗯,很有趣。我已经添加了字段" name“,并使每个项目的名称不同,现在它可以工作了。

代码语言:javascript
复制
{-# LANGUAGE DeriveDataTypeable #-}

import Test.HUnit
import Data.IxSet
import Data.List.Split ( splitOn )
import Data.Data ( Data, Typeable )

newtype TaggedItemName = TaggedItemName { unTaggedItemName :: String }
                       deriving ( Show, Ord, Eq, Data, Typeable )

data TaggedItem = TaggedItem { getName :: TaggedItemName, getTags :: String }
                deriving ( Show, Ord, Eq, Data, Typeable )

data Tag = Tag String
           deriving ( Show, Ord, Eq, Data, Typeable )

getTagStrings :: TaggedItem -> [Tag]
getTagStrings = map Tag . splitOn "," . getTags

instance Indexable TaggedItem where
  empty = ixSet
            [ ixFun getTagStrings ]

test3 = TestCase (
  assertEqual "ixFun multiple tags test"
  3
  (size (index @= (Tag "tag"))) )
  where items = [ TaggedItem (TaggedItemName "name1") "tag,tag1,tag2"
                , TaggedItem (TaggedItemName "name2") "tag,tag1,tag2"
                , TaggedItem (TaggedItemName "name3") "tag,tag1,tag2" ]
        index = fromList items

tests = TestList [
  -- TestLabel "test1" test1,
  -- TestLabel "test2" test2,
  TestLabel "test3" test3]

main = do
  runTestTT tests

很管用。因此,也许IxSet认为这些项目是相同的,并以某种方式将它们合并(?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-20 16:16:07

是的,看起来IxSet合并了相等的值。我采用了第一个示例,并对其进行了更改,使其做到了:

代码语言:javascript
复制
  where items = [ TaggedItem "tag,tag1,tag2"
                , TaggedItem "tag,tag3,tag4"
                , TaggedItem "tag,tag5,tag6" ]

现在它也起作用了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14421648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档