В частности, в отношении сопоставления с образцом и классов 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
}
}
Для любого примера вызова, скажем, simpleify (UnOp («-», UnOp («-», UnOp («-», UnOp («-», Var («x»)) ))))
(что приводит к Var ("x")
), имеет ли значение порядок альтернатив в выражении соответствия для производительности?
Дополнительное примечание, отчасти связанное (мой собственное наблюдение): Одна вещь, которая действительно поражает меня в упрощении
, заключается в том, что это рекурсивная функция, хотя в отличие от других рекурсивных функций, которые я написал / рассмотрел, базовый вариант используется последним, избегайте преждевременного прерывания.