2011年12月23日金曜日

Foldable

冬休み入ったのでのびのびひきこもりたいとおもいます。

Foldable

畳み込み関数を持ちます。
最低限実装しなければならないものはfoldRightかfoldMapです。

MA#foldMap

foldMapは要素をMonoidへ変換し、結合します。


MA#foldr, MA#foldl

右畳み込みと左畳み込み。


MA#foldl1, MA#foldr1

foldの初期値をなくしたもの。
失敗した場合はNoneが返る。


MA#foldLeftM, MA#foldRightM

モナドに包み、合成します。


MA#all, MA#∀, MA#any, MA#∃, MA#element, MA#∋, MA#∈:

allとanyは述語を、elementは要素を渡します。
∀, ∃, ∋, ∈:はエイリアスです。


MA#empty, MA#count, MA#foldIndex

emptyは空かどうか、countは要素の数、foldIndexはインデックスの値を取得します。
foldIndexは失敗した場合例外を投げます。


MA#listl, MA#listr, MA#stream

listl, listrはListに、streamはStreamにまとめます。
listlはfoldlで、listrはfoldrで実装されています。


MA#maximum, MA#minimum

要素の中から最大値、最小値を取得します。
要素が存在しない場合、Noneが返ります。


MA#selectSplit, MA#splitWith

selectSplitは述語が真の連続する要素を集めます。
偽の要素は捨てられます。

splitWithは述語が真か偽に変わるまで要素を集めます。


畳み込み関数は汎用性が高いのでFoldableが定義されるだけでこれだけの関数が使えるようになります。
前に紹介したTraverseは畳み込み関数が定義されていると定義がしやすかったのですが、Foldableは継承されていません。
しかし、Scalaz7ではTraverseがFoldableを継承するように変更されています。

0 件のコメント:

コメントを投稿