generated at
foldMap
Foldable型クラスのmethodの1つ


定義
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 をmonoid m にしてから、
mappend :: m -> m -> m で連結している
fold関数を知っている状態から理解するならば、
foldでは、 id を適用しているので「畳み込み時に何らかの処理」をすることができない
それでは汎用性がないので、 mappend . f のように、
f に適用して変換してから、 mappend で連結するようにする
返り値はMonoidである


具体例
MonoidとしてList、FoldableとしてListを選択する
hs
foldMap :: ([a] -> [b]) -> [[a]] -> [b] foldMap f = foldr ((++) . f) []
Monoidはinstanceそれ自身が値になるので、返り値の m は、リスト [b] になる
使用例
hs
foldMap       (map (*10)) [[1],[2],[3]]        -- [10,20,30] fold $ map (map (*10)) [[1],[2],[3]] -- [10,20,30]
こうやって見れば、 map して fold しているものを foldMap と呼んでいるのがわかりやすい
補足
hs
map (map (*10)) [[1],[2],[3]] -- [[10],[20],[30]] fold [[10],[20],[30]] -- [10,20,30]
MonoidとしてListを選択したそれは concatMap という名前で定義されている
hs
concatMap :: Foldable t => (a -> [b]) -> t a -> [b] concatMap f = foldr ((++) . f) []
こう書いても同じ
hs
concatMap f = concat . map f
map してから、 concat ( fold )する


参考