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