В каждом примере, который я видел ранее, используется дерево выражений. Вы можете легко построить его в Scala с классами case. Например, приблизительный эскиз, включающий сопоставление образцов и объектно-ориентированный стиль:
trait Exp {
def differentiate: Exp
}
case class Const(value: Double) extends Exp {
def differentiate = Const(0)
}
case class Var(label: String, power: Double) extends Exp {
def differentiate = this match {
case Var(l,0.0) => Const(0)
case Var(l,p) => Mul(Const(p), Var(l,p-1))
}
}
case class Add(left: Exp, right: Exp) extends Exp {
def differentiate = Add(left.differentiate, right.differentiate)
}
case class Mult(left: Exp, right: Exp) extends Exp {
def differentiate = (left, right) match {
case (Const(c), exp) => Mul(Const(c), exp.differentiate)
case (exp, Const(c)) => Mul(Const(c), exp.differentiate)
case (e1, e2) => Add(Mul(e1.differentiate, e2), Mul(e1, e2.differentiate))
}
}
Вы имеете в виду 'def differiate (exp: T) = ...'? Какой тип exp? Строка? Функция? Оба не подходят для «+» или «*». –
Возможно, это было вдохновением для вашего вопроса, но если вы его уже не видели, см. Расширенный пример в главе «Соответствие шаблону программирования в Scala» (http://www.artima.com/pins1ed/case-classes- and-pattern-matching.html) –
@userunknown Выражение – Frawr