Foldable型クラス
すべての要素を使って計算を行う
foldrをListだけでなく他の型に対しても適用できるようにする
hs
hsclass Foldable t where
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b
6つのmethodを持つ
foldMapかfoldrのいずれかを定義すればあとは自動的に決まる
なので結局1つの定義で済む

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を理解するのに良さそうな順序
以下を、上から順に理解していくとスムーズな気がする

0 定義を無視して、
foldrの使い方を知っておく
引数の意味と使い方をまず知っておく
定義はあとで見るのでいったん無視していい
他の関数の定義に foldr
が使われるのでここの意味をわかっていないと話が進まない
foldMapを少し具体化する
foldMapを理解してれば簡単
foldrの定義の意味を理解する
foldrを少し拡張したものと捉える
pursのListってなんでFoldableのinstanceじゃないの?
Arrayはなってる
そのせいで List (Tuple ..)
を Map
に変換できない
参考
めっちゃ良い

ただ、コードのレイアウトが見づらい

論文
具体例 | Listでの具体例 |
fold | concat |
foldMap | concatMap |
自分で定義した foldr
の定義(左辺)が、Preludeの提供する foldr
(右辺)との間の間で以下を満たす
hsfoldr 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
補足