リストのリストにリストを追加するにはどうすればよいですか? リストのリストであるに追加itemz
したいとします。bagList
どうやってやるの?
bagList itemz = mappend bagList itemz
前に追加することを検討したい場合があります。これはより高速です。
bagItem bag item = item : bag
また、あなたは命令的な考え方から来ているように見えます.theのbagList
前後の使い方が=
正しくありません.theの前後の表現=
は実際には同じ構造を表しているわけではありません. が関数として使用される前に=
bagItem
、関数として使用された後=
(Monoid
これがリストである場合itemz
は、リストである必要もあります)。
本当に項目を追加したい場合 (これは遅くなります。操作ではリスト全体を最後に新しい項目を追加する必要があり、リスト全体を再構築する必要があるためです)。クリストフが提案するか、次のような再帰的な定式化を行うことができます。
appendItem :: a -> [a] -> [a]
appendItem i (x:xs) = x : appendItem i xs
appendItem i [] = i : []
両方とも追加したいが、パフォーマンスも心配している場合は、差分リストを確認する必要があります。たとえば、「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)]