foldMap
定義
code:hs
foldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
foldMap f = foldr (mappend . f) mempty
mappend . f :: a -> m -> mは、
fで、任意のaをmonoidmにしてから、
mappend :: m -> m -> mで連結している
foldでは、idを適用しているので「畳み込み時に何らかの処理」をすることができない
それでは汎用性がないので、mappend . fのように、
fに適用して変換してから、mappendで連結するようにする
返り値はMonoidである
具体例
MonoidとしてList、FoldableとしてListを選択する
code:hs
foldMap :: (a -> b) -> a -> b foldMap f = foldr ((++) . f) []
使用例
code:hs
こうやって見れば、mapしてfoldしているものをfoldMapと呼んでいるのがわかりやすい
補足
code:hs
map (map (*10)) 1],2,[3 -- 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)する
参考