foldMap
Foldable型クラスのmethodの1つ
定義
code:hs
foldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
foldMap f = foldr (mappend . f) mempty
foldrに2つの引数を与えている
初期値としてmemptyを使っている
mappend . f :: a -> m -> mは、
fで、任意のaをmonoidmにしてから、
mappend :: m -> m -> mで連結している
fold関数を知っている状態から理解するならば、
foldでは、idを適用しているので「畳み込み時に何らかの処理」をすることができない
それでは汎用性がないので、mappend . fのように、
fに適用して変換してから、mappendで連結するようにする
返り値はMonoidである
具体例
MonoidとしてList、FoldableとしてListを選択する
code:hs
foldMap :: (a -> b) -> a -> b
foldMap f = foldr ((++) . f) []
Monoidはinstanceそれ自身が値になるので、返り値のmは、リスト[b]になる
使用例
code:hs
foldMap       (map (*10)) 1],2,[3        -- 10,20,30
fold $ map (map (*10)) 1],2,[3 -- 10,20,30
こうやって見れば、mapしてfoldしているものをfoldMapと呼んでいるのがわかりやすい
補足
code:hs
map (map (*10)) 1],2,[3 -- 10],20,[30
fold 10],20,[30 -- 10,20,30
MonoidとしてListを選択したそれはconcatMapという名前で定義されている
code:hs
concatMap :: Foldable t => (a -> b) -> t a -> b
concatMap f = foldr ((++) . f) []
こう書いても同じ
code:hs
concatMap f = concat . map f
mapしてから、concat(fold)する
参考
第34回 様々なデータ構造でfoldを使えるようにするFoldableクラス(2ページ目) | 日経クロステック(xTECH)
https://github.com/Gabriel439/slides/blob/main/munihac/foldmap.md