Foldable型クラス
畳み込み(fold)ができる型クラス
すべての要素を使って計算を行う
foldrの一般化
foldrをListだけでなく他の型に対しても適用できるようにする
hs
hackage
code:hs
class Foldable t where
foldMap :: Monoid m => (a -> m) -> t a -> m
foldr :: (a -> b -> b) -> b -> t a -> b
6つのmethodを持つ
fold関数
foldMap
foldr
foldl
foldr1
foldl1
foldMapかfoldrのいずれかを定義すればあとは自動的に決まる
なので結局1つの定義で済むmrsekut.icon
purs
pursuit
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の使い方を知っておく
引数の意味と使い方をまず知っておく
ref fold/unfoldの練習
定義はあとで見るのでいったん無視していい
他の関数の定義にfoldrが使われるのでここの意味をわかっていないと話が進まない
1 foldMap
2 fold関数
foldMapを少し具体化する
foldMapを理解してれば簡単
3 foldr
foldrの定義の意味を理解する
4 foldl
foldrを少し拡張したものと捉える
5 foldl1, foldr1
#??
pursのListってなんでFoldableのinstanceじゃないの?
Arrayはなってる
そのせいでList (Tuple ..)をMapに変換できない
参考
第34回 様々なデータ構造でfoldを使えるようにするFoldableクラス | 日経クロステック(xTECH)
めっちゃ良いmrsekut.icon
ただ、コードのレイアウトが見づらいmrsekut.icon
https://qiita.com/lotz/items/424abee02fe598c60247
FoldableとCatamorphismとの関係
https://www.semanticscholar.org/paper/Calculate-Polytypically!-Meertens/58599c9354b443bc71097fcdedbd9a2c0d7f3d1c
論文
#WIP
table:具体例
Listでの具体例
fold concat
foldMap concatMap
Foldable則
自分で定義した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 (:) []
https://en.wikibooks.org/wiki/Haskell/Foldable
https://kmyk.github.io/blog/blog/2014/12/21/foldable-and-traversable/
https://qiita.com/Izawa_/items/1a5d2fd99aa49524db03
https://enakai00.hatenablog.com/entry/20131105/1383714391
https://snak.tdiary.net/20091020.html#p02
http://comonad.com/reader/2015/free-monoids-in-haskell/
https://blog.tiqwab.com/2019/02/17/monoid-and-foldable.html