Scalazは、、、などのさまざまなADTにちなんで名付けられたメソッドを提供します。fold
このBoolean
メソッドは、基本的に、その特定のADTのすべての可能なケースに対応する関数を取ります。つまり、以下に示すパターンマッチです。Option[_]
Validation[_, _]
Either[_, _]
x match {
case Case1(a, b, c) => f(a, b, c)
case Case2(a, b) => g(a, b)
.
.
case CaseN => z
}
と同等です:
x.fold(f, g, ..., z)
いくつかの例:
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
同時に、Traversable[_]
タイプに同じ名前の操作があり、コレクションをトラバースしてその要素に対して特定の操作を実行し、結果値を累積します。例えば、
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つの操作が同じ名前(fold
/ catamorphism)で識別されるのはなぜですか?私は2つの間に類似点/関係を見ることはできません。私は何が欠けていますか?