将列表添加到Haskell中的列表列表中

时间:2015-10-04 10:45:43

标签: list haskell monoids

如何将列表添加到列表列表中?假设我要将itemz添加到bagList,这是一个列表列表。我怎么能这样做?

bagList itemz = mappend bagList itemz               

1 个答案:

答案 0 :(得分: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 : [] 是列表,则还需要列表)。

如果你确实想要附加项目(这将会更慢,因为操作将需要一直到列表中以在最后添加新项目,并且需要重建整个列表)可以做Christoph建议的事情,或者你可以采用这样的递归方式:

Map

如果你们想要追加并且也担心表现,你应该看看差异列表,例如在this chapter in Learn You a Haskell中查找关于差异列表的部分。

<强>更新

从评论来看,您实际上正在寻找的是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)]

cargo install