Boolean
Option[_]
Validation[_, _]
Either[_, _]
などのように、ScalazはさまざまなADTに対してfold
という名前のメソッドを提供します。このメソッドは基本的にADTのすべての可能なケースに対応する関数を取ります。換言すれば、以下に示すパターンマッチ:同時に、同じでの動作がある折りたたみオプション、いずれかなどの関係は何ですか?
scala> (9 == 8).fold("foo", "bar")
res0: java.lang.String = bar
scala> 5.some.fold(2 *, 2)
res1: Int = 10
scala> 5.left[String].fold(2 +, "[" +)
res2: Any = 7
scala> 5.fail[String].fold(2 +, "[" +)
res6: Any = 7
:いくつかの例
x.fold(f, g, ..., z)
:
x match {
case Case1(a, b, c) => f(a, b, c)
case Case2(a, b) => g(a, b)
.
.
case CaseN => z
}
は、と等価ですTraversable[_]
タイプの名前。そのエレメントで特定の操作を実行しているコレクションをトラバースし、結果の値を累積します。 fold
/catamorphism - 例えば、
scala> List(2, 90, 11).foldLeft("Contents: ")(_ + _.toString + " ")
res9: java.lang.String = "Contents: 2 90 11 "
scala> List(2, 90, 11).fold(0)(_ + _)
res10: Int = 103
scala> List(2, 90, 11).fold(1)(_ * _)
res11: Int = 1980
は、なぜこれらの2つの操作が同じ名前で識別されますか?私は両者の間に類似点や関係がないのを見ている。私は何が欠けていますか?
ああ、再帰的に適用する必要があります!ありがとう、ありがとう。 – missingfaktor
[catamorphismに関するWikipediaのページ](http://en.wikipedia.org/wiki/Catamorphism)では、「関数型プログラミングでは、関数型プログラミングは関数型プログラミングから任意の代数的データにわたるリストのフォールドを一般化したものです初期代数として記述することができます。その後、Erik Meijerの論文「バナナ、レンズ、封筒、有刺鉄線による機能プログラミング」を指摘する。トピックをよりよく理解するためには、その論文を読むべきだと思います。 – missingfaktor
@missingfaktor、ウィキペディアのページの最後には、非常にアクセス可能であるような変態に関する6つのブログがあります。私は今それを読んでいる。それはF#ですが、それはあなたにとって問題ではないと確信しています。 – huynhjl