簡短的回答是「是」;某些謂詞上的分支邏輯可以作爲庫函數來實現。
值得指出的是,正如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
大知道這個!這確實看起來像是下一個合乎邏輯的步驟......我期待着未來:-) – 2011-05-26 14:04:24