Foldable型クラス
すべての要素を使って計算を行う
foldrをListだけでなく他の型に対しても適用できるようにする
hs
code: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.icon
purs
code: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.icon
0 定義を無視して、foldrの使い方を知っておく 引数の意味と使い方をまず知っておく
定義はあとで見るのでいったん無視していい
他の関数の定義にfoldrが使われるのでここの意味をわかっていないと話が進まない
foldMapを少し具体化する
foldMapを理解してれば簡単
foldrの定義の意味を理解する
foldrを少し拡張したものと捉える
pursのListってなんでFoldableのinstanceじゃないの?
Arrayはなってる
そのせいでList (Tuple ..)をMapに変換できない
参考
めっちゃ良いmrsekut.icon
ただ、コードのレイアウトが見づらいmrsekut.icon
論文
table:具体例
Listでの具体例
fold concat
foldMap concatMap
自分で定義したfoldrの定義(左辺)が、Preludeの提供するfoldr(右辺)との間の間で以下を満たす
code: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
補足
code:hs
toList = foldr (:) []