简短的回答是“是”;某些谓词上的分支逻辑可以实现为库函数。
值得指出的是,正如 Viktor Klang 和其他人所指出的,if/else 本质上是折叠一个布尔值。弃牌是我们经常做的事情——有时它是清晰明确的,有时不是。
// Either#fold is explicit
scala> Left[String, Double]("fail") fold(identity, _ + 1 toString)
res0: java.lang.String = fail
scala> Right[String, Double](4) fold(identity, _ + 1 toString)
res1: java.lang.String = 5.0
折叠一个选项不能明确地完成,但我们一直在这样做。
// Option has no fold - wont compile!
Some(5) fold(1+, 0)
// .. but the following is equivalent and valid
scala> Some(5) map(1+) getOrElse(0)
res3: Int = 6
布尔值上的分支逻辑也是一个折叠,您可以相应地拉皮条布尔值。注意使用按名称参数来实现惰性求值。没有这个特性,这样的实现是不可能的。
// pimped Boolean - evaluates t when true, f when false
class FoldableBoolean(b: Boolean) {
def fold[A](t: => A, f: => A) =
if(b) t else f
}
implicit def b2fb(b: Boolean) = new FoldableBoolean(b)
现在我们可以折叠布尔值:
scala> true fold("true!", "false")
res24: java.lang.String = true!
scala> false fold("true!", "false")
res25: java.lang.String = false