В частности, в отношении сопоставления с образцом и классами дел. Учтите следующее:
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
, это то, что это рекурсивная функция, хотя в отличие от других рекурсивных функций, которые я написал / имел дело с, базовый случай стоит последним, чтобы избежать преждевременного завершения.