如何将列表添加到列表列表中?假设我要添加itemz
到bagList
,这是一个列表列表。我怎样才能做到这一点?
bagList itemz = mappend bagList itemz
您可能要考虑在前面添加它,这样会更快:
bagItem bag item = item : bag
此外,看起来您来自命令式思维方式,您bagList
在之前和之后使用的=
方式并不完全正确:之前和之后的表达式=
并不真正代表相同的结构。在=
bagItem
用作函数之前,在=
用作某些函数之后Monoid
(如果itemz
是列表也需要是列表)。
如果你真的想追加项目(这会更慢,因为操作需要一直遍历列表以在最后添加新项目,并且需要重建整个列表)你可以做什么Christoph 建议,或者您可以采用这样的递归公式:
appendItem :: a -> [a] -> [a]
appendItem i (x:xs) = x : appendItem i xs
appendItem i [] = i : []
如果你既想追加又担心性能,你应该看看差异列表,例如在 Learn You a Haskell 中查找本章中关于差异列表的部分。
更新
从评论看来,你真正要找的是Map
s。我们可以将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)]