【发布时间】:2011-12-16 20:48:50
【问题描述】:
Scalaz 为各种 ADT 提供了一个名为 fold 的方法,例如 Boolean、Option[_]、Validation[_, _]、Either[_, _] 等。该方法基本上采用与给定 ADT 的所有可能情况相对应的函数。换句话说,如下所示的模式匹配:
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?我看不出两者之间有任何相似之处/关系。我错过了什么?
【问题讨论】:
标签: scala functional-programming scalaz category-theory catamorphism