В частности, в отношении сопоставления шаблонов и классов case. Рассмотрим следующее:
abstract class Expr
case class Var(name: String) extends Expr
case class Number(num: Double) extends Expr
case class UnOp(operator: String, arg: Expr) extends Expr
case class BinOp(operator: String, left: Expr, right: Expr) extends Expr
object Expr {
def simplify(expr: Expr): Expr = expr match {
// Some basic simplification rules...
case UnOp("-", UnOp("-", e)) => simplify(e) // Double negation
case BinOp("+", e, Number(0)) => simplify(e) // Adding zero
case BinOp("-", e, Number(0)) => simplify(e) // Subtracting zero
case BinOp("*", e, Number(1)) => simplify(e) // Multiplying by one
case BinOp("*", e, Number(0)) => Number(0) // Multiplying by zero
case _ => expr // Default, could not simplify given above rules
}
}
Для любого примера вызова, скажем, simplify(UnOp("-", UnOp("-", UnOp("-", UnOp("-", Var("x"))))))
(что приводит к Var("x")
), имеет ли порядок альтернатив в выражении соответствия производительность?
Боковое примечание, род связанный (мое собственное наблюдение): Одна вещь, которая действительно поражает меня о simplify
, заключается в том, что она является рекурсивной функцией, хотя, в отличие от других рекурсивных функций, я написал /, основной случай приходит последним, чтобы избежать раннего завершения.