gpt4 book ai didi

haskell - IxSet 中的文本索引

转载 作者:行者123 更新时间:2023-12-01 01:12:36 25 4
gpt4 key购买 nike

似乎我不明白 IxSet 中的文本索引如何应该管用。在这里,我创建了一个单元测试,通过 tags 索引项目字段,然后通过标签“tag”查询项目。它应该(从我的角度来看)给我所有 3 个项目(因为它们都有标签“标签”),但似乎没有。我不明白为什么。

{-# 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

更新:

嗯,挺有意思的。我已经添加了字段“名称”并在每个项目名称上设置了不同的名称,现在它可以工作了。
{-# 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 认为这些项目相同并以某种方式合并它们(?)

最佳答案

是的,似乎 IxSet 合并了相等的值。我拿了第一个例子并改变了它,使它做到:

  where items = [ TaggedItem "tag,tag1,tag2"
, TaggedItem "tag,tag3,tag4"
, TaggedItem "tag,tag5,tag6" ]

现在它也有效。

关于haskell - IxSet 中的文本索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14421648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com