Scalaz 提供了一个为各种 ADT 命名的方法,fold
例如Boolean
、Option[_]
、等。该方法基本上采用与给定 ADT 的所有可能情况相对应的函数。换句话说,如下所示的模式匹配: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
为什么这两个操作使用相同的名称 - fold
/catamorphism?我看不出两者之间有任何相似之处/关系。我错过了什么?