generated at
Foldable型クラス
すべての要素を使って計算を行う
foldrの一般化
foldrをListだけでなく他の型に対しても適用できるようにする

hs
hs
class Foldable t where foldMap :: Monoid m => (a -> m) -> t a -> m foldr :: (a -> b -> b) -> b -> t a -> b
6つのmethodを持つ
foldMapかfoldrのいずれかを定義すればあとは自動的に決まる
なので結局1つの定義で済むmrsekut



purs
purs(hs)
class Foldable f where foldMap :: forall a m. Monoid m => (a -> m) -> f a -> m foldr :: forall a b. (a -> b -> b) -> b -> f a -> b foldl :: forall a b. (b -> a -> b) -> b -> f a -> b



6つのmethodを理解するのに良さそうな順序
以下を、上から順に理解していくとスムーズな気がするmrsekut
この記事がこの順序で解説していた
0 定義を無視して、foldrの使い方を知っておく
引数の意味と使い方をまず知っておく
定義はあとで見るのでいったん無視していい
他の関数の定義に foldr が使われるのでここの意味をわかっていないと話が進まない
foldMapを少し具体化する
foldMapを理解してれば簡単
foldrの定義の意味を理解する
foldrを少し拡張したものと捉える



pursのListってなんでFoldableのinstanceじゃないの?
Arrayはなってる
そのせいで List (Tuple ..) Map に変換できない




参考
めっちゃ良いmrsekut
ただ、コードのレイアウトが見づらいmrsekut
FoldableとCatamorphismとの関係
論文





具体例
Listでの具体例
foldconcat
foldMapconcatMap


自分で定義した foldr の定義(左辺)が、Preludeの提供する foldr (右辺)との間の間で以下を満たす
hs
foldr f z = Prelude.foldr f z . toList foldl f z = Prelude.foldl f z . toList foldr1 f = Prelude.foldr1 f . toList foldl1 f = Prelude.foldl1 f . toList
補足
hs
toList = foldr (:) []