foldMap
定義
hsfoldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
foldMap f = foldr (mappend . f) mempty
mappend . f :: a -> m -> m
は、
f
で、任意の a
をmonoid m
にしてから、
mappend :: m -> m -> m
で連結している
foldでは、 id
を適用しているので「畳み込み時に何らかの処理」をすることができない
それでは汎用性がないので、 mappend . f
のように、
f
に適用して変換してから、 mappend
で連結するようにする
返り値はMonoidである
具体例
MonoidとしてList、FoldableとしてListを選択する
hsfoldMap :: ([a] -> [b]) -> [[a]] -> [b]
foldMap f = foldr ((++) . f) []
使用例
hsfoldMap (map (*10)) [[1],[2],[3]] -- [10,20,30]
fold $ map (map (*10)) [[1],[2],[3]] -- [10,20,30]
こうやって見れば、 map
して fold
しているものを foldMap
と呼んでいるのがわかりやすい
補足
hsmap (map (*10)) [[1],[2],[3]] -- [[10],[20],[30]]
fold [[10],[20],[30]] -- [10,20,30]
MonoidとしてListを選択したそれは concatMap
という名前で定義されている
hsconcatMap :: Foldable t => (a -> [b]) -> t a -> [b]
concatMap f = foldr ((++) . f) []
こう書いても同じ
hsconcatMap f = concat . map f
map
してから、 concat
( fold
)する
参考