我想知道为什么scala.Option没有fold这样定义的方法:
fold(ifSome: A => B , ifNone: => B)
Run Code Online (Sandbox Code Playgroud)
相当于
map(ifSome).getOrElse(ifNone)
Run Code Online (Sandbox Code Playgroud)
有没有比使用map+ 更好的getOrElse?
Scalaz提供了一个名为方法fold关于各种ADT的如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
}
Run Code Online (Sandbox Code Playgroud)
相当于:
x.fold(f, g, ..., z)
Run Code Online (Sandbox Code Playgroud)
一些例子:
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
Run Code Online (Sandbox Code Playgroud)
同时,对于Traversable[_] …
functional-programming scala category-theory scalaz catamorphism