Scala 部分函数中案例的评估顺序

Order of evaluation of cases in Scala partial function

我可以假设在 Scala 中计算偏函数的情况下的顺序吗?

例如,给定

protected val eval: PartialFunction[(TestPrimitive, Seq[Literal]), Boolean] = {
    case (L3IntLt, Seq(IntLit(x), IntLit(y))) => x < y
    case (L3IntLe, Seq(IntLit(x), IntLit(y))) => x <= y
    case (L3IntGe, Seq(IntLit(x), IntLit(y))) => x >= y
    case (L3IntGt, Seq(IntLit(x), IntLit(y))) => x > y
    case (L3Eq, Seq(x, y)) => x == y
    case (L3Ne, Seq(x, y)) => x != y
  }

如果我可以假设案例是按顺序评估的,我可以将代码分解为:

protected val eval: PartialFunction[(TestPrimitive, Seq[Literal]), Boolean] = {
    case (L3Eq, Seq(x, y)) => x == y
    case (L3Ne, Seq(x, y)) => x != y
    case (arithp, Seq(IntLit(x), IntLit(y))) => arithp match{
      case L3IntLt => x < y
      case L3IntLe => x <= y
      case L3IntGe => x >= y
      case L3IntGt => x > y  
    }
  }

假设在案例的评估中有一个顺序是一个好的编程习惯吗?

假设评估顺序是我们需要预先做的事情之一。我也会像你一样重构我的代码!

是的,案件是从上到下评估的,第一个匹配的获胜。这是一个很好的做法,因为它通常被 scala 程序员理解,并且它是许多 scala 代码使用的非常常见的模式。

例如,对于非穷举匹配,通常指定一个包罗万象:

x match {
  case "value1" => ...
  case "value2" => ...
  case other => ...
}

很明显,这取决于顺序,因为如果一开始就是包罗万象的情况,它就会包罗万象。

Programming in Scala (First Edition), chapter 15中,您会发现:

A match expression is evaluated by trying each of the patterns in the order they are written. The first pattern that matches is selected . . .