0
如何将列表添加到列表中?假设我想将itemz
添加到bagList
,这是一个列表列表。我怎样才能做到这一点?将列表添加到Haskell中的列表中
bagList itemz = mappend bagList itemz
如何将列表添加到列表中?假设我想将itemz
添加到bagList
,这是一个列表列表。我怎样才能做到这一点?将列表添加到Haskell中的列表中
bagList itemz = mappend bagList itemz
你可能要考虑在前面加吧,这是速度快:
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)]
明白了。在此感谢您的详细解释。所以基本上,如果我想创建一个数据结构来存储包中的物品和它们的编号,我可以创建类似于:bag :: Eq a => [a] - > [a] - > [a] –
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 –
@ user9515中的元素和数量:这听起来像是一个单独的问题。我可能不会在每个集合中单独存储项目的数量,因为您运行数字的风险与项目集不同步。毕竟,检索每个子列表中的项目数量也很容易:'map length bag'。如果你确实想把每一组商品的编号存储起来,我可能会选择一个'bag :: [(Int,[a])]',这些商品的列表以长度存储在包里。然后,您可以添加项目:'bagItems bag items =(length items,items):bag'。 –