我正在寻找一个适用于Scala的简单的CAS系统。
它应该具备以下功能:
- 通过case类(便于匹配)提供对抽象语法树的访问权限 - 将字符串解析为AST - 简化表达式
如果没有现成的,我需要自己写一个基础版本,最好的表述方式是什么?
我想到的大概是这样的:
我会实现这里描述的简化算法,看起来很繁琐。(但也许在简化代数表达式时无法避免繁琐?)
一些对此特定实现的批评是:
它应该具备以下功能:
- 通过case类(便于匹配)提供对抽象语法树的访问权限 - 将字符串解析为AST - 简化表达式
如果没有现成的,我需要自己写一个基础版本,最好的表述方式是什么?
我想到的大概是这样的:
abstract trait Term
{
def simplify:Term
def evaluate(assignment:Var => Double):Double
def derivative:Term
}
case class Const(c:Int) extends Term
case class Var(x:String) extends Term
case class Negate(x:Term) extends Term
case class Subtract(x:Term, y:Term) extends Term
case class Divide(x:Term, y:Term) extends Term
object Add { def apply(x:Term*):Add = Add(x.toList) }
case class Add(xs : List[Term]) extends Term
object Multiply { def apply(x:Term*):Multiply = Multiply(x.toList) }
case class Multiply(xs:List[Term]) extends Term
case class Power(x:Term, y:Term) extends Term
case class Exp(x:Term) extends Term
我会实现这里描述的简化算法,看起来很繁琐。(但也许在简化代数表达式时无法避免繁琐?)
一些对此特定实现的批评是:
- 我将在各个地方递归调用
simplify
,对于案例类的参数(似乎可以以某种方式集中处理) - 处理
Add
和Multiply
的可变参数/List
参数似乎会变得混乱
((a * c * x^2) + (b * x^2))
的表达式到(a*c + b) * x^2
的任何提示?使用Power
很容易完成类似的操作,但是对于Multiply
和Add
的列表来说,这让我感到很棘手。 - dsg