2015-10-04 66 views

回答

2

你可能要考虑在前面加吧,这是速度快:

bagItem bag item = item : bag 

此外,它看起来像你从一个势在必行的心态来了,你之前和之后使用bagList方式=并不完全正确:=之前和之后的表达式并不代表相同的构造。在使用=bagItem作为函数之前,=之后它被用作Monoid(如果itemz是列表,还需要列表)。

如果你确实想追加这个项目(这样做会比较慢,因为这个操作需要一路通过列表在最后添加新项目,整个列表需要重建)你可以做什么克里斯托夫建议,或者你可以去一个递归公式是这样的:

appendItem :: a -> [a] -> [a] 
appendItem i (x:xs) = x : appendItem i xs 
appendItem i [] = i : [] 

如果你既想追加和也担心性能,你应该看看差异表,例如看对于this chapter in Learn You a Haskell中的差异列表部分。


更新

从它似乎什么你实际上是在寻找的评论是Map秒。我们可以制作一个Map,每个项目作为关键字,出现次数作为值。在你的情况下,似乎这将是一个Map String Int

import Data.List (foldl') 
import qualified Data.Map as M 

bag :: M.Map String Int 
bag = M.empty 

addToBag :: M.Map String Int -> [String] -> M.Map String Int 
addToBag = foldl' go 
    where go m i = M.insertWith (+) i 1 m 

main = print $ addToBag bag ["a","b","c","a"] 
-- fromList [("a",2), ("b", 1), ("c", 1)] 
+0

明白了。在此感谢您的详细解释。所以基本上,如果我想创建一个数据结构来存储包中的物品和它们的编号,我可以创建类似于:bag :: Eq a => [a] - > [a] - > [a] –

+0

bag :: Eq a => [a] - > [a] - [a] bag items nr = if null items || null nr then append bagItems [] else append bagItems items append bagItemsNr nr?我可以做些什么来存储每个bg –

+0

@ user9515中的元素和数量:这听起来像是一个单独的问题。我可能不会在每个集合中单独存储项目的数量,因为您运行数字的风险与项目集不同步。毕竟,检索每个子列表中的项目数量也很容易:'map length bag'。如果你确实想把每一组商品的编号存储起来,我可能会选择一个'bag :: [(Int,[a])]',这些商品的列表以长度存储在包里。然后,您可以添加项目:'bagItems bag items =(length items,items):bag'。 –