如何将列表添加到列表列表中?假设我要将itemz
添加到bagList
,这是一个列表列表。我怎么能这样做?
bagList itemz = mappend bagList itemz
答案 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