0

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

bagList itemz = mappend bagList itemz               
4

1 回答 1

2

您可能要考虑在前面添加它,这样会更快:

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 中查找本章中关于差异列表的部分。


更新

从评论看来,你真正要找的是Maps。我们可以将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)]
于 2015-10-04T14:05:18.327 回答