我试图在C#中实现一个基础结构,该基础结构允许我进行任意的数学表达式。例如,我希望能够采用如下表达式

asin(sqrt(z-sin(x + y)^ 2))

并将其变成一个对象,使我可以根据x,y和z对其进行评估,获得导数,并可能对其进行某种符号代数。人们对C#中的良好模型有何想法?

我有自己的看法,我担心这会进入建筑航天领域,因此我想确保事实并非如此。

基本上,像sin,+,sqrt等功能具有基于基类的类:

Function

Function<TOut> : Function
    TOut Value

Function<Tin, TOut> : Function
    TOut Evaluate(TIn value)
    Function Derivative
    Function<TOut, TIn> INverse

Function<TInA, TInB, TOut> : Function
    TOut Evaluate(TInA valueA, TInB valueB)
    Function PartialDerivativeA
    Function PartialDerivativeB

到目前为止,如此简单。诀窍是如何组成功能。在这里,我相信我想要一种类似currying的方法,这样我就可以评估单个参数的功能,而保留其他参数。所以我正在考虑像这样的工厂类(class):
Function<TInA, TInB, TOut> ->
           Function<TInA, Function<TInB, TOut>>

(Function<TInA, TInB, TOut>, Function<TInX, TInA>, null) ->
           Function<TInX, Function<TInB, TOut>>

(Function<TInA, TInB, TOut>, Function<TInA>, Function<TInX, TInY, TInB>) ->
           Function<TInX, Function<TInY, TInB>>

等等。我主要担心的是,泛型类型可能会使系统无法使用(如果要求用户仅知道要评估的完整泛型类型),并且我可能无法从输入参数构造所有泛型类型。

感谢您的输入!

最佳答案

请注意,可以使用C#编译器评估表达式。

通过在运行时编译C#代码来评估数学表达式
http://www.codeproject.com/KB/recipes/matheval.aspx

关于c# - 在C#中确认Greenspun的第十定律,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2208832/

10-17 02:36