0

リストのリストにリストを追加するにはどうすればよいですか? リストのリストであるに追加itemzしたいとします。bagListどうやってやるの?

bagList itemz = mappend bagList itemz               
4

1 に答える 1

2

前に追加することを検討したい場合があります。これはより高速です。

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 を学ぶ」のこの章の差分リストに関するセクションを探してください。


アップデート

コメントから、あなたが実際に探しているのは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 に答える