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 . . .
我可以假设在 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 . . .