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'。 –