我正在构建一个符号衍生引擎。例如
let f = <@ fun x:double -> x * x @>
let df = der f
结果表达式将是
<@ 2 * x @>
实际的方程可以是任意复杂的。
使用递归生成导数并不太难
模式匹配和转换,但最后我想使用
在紧密的数字循环中生成的方程就好像我有手一样
写了他们。这是数值计算代码,所以总是更快
更好(如果可能)
我看过 FSharpX 引用编译器,但它看起来像一个解释器而不是一个编译器。
请您参考如下方法:
我尚未对此进行测试,但将 F# 引用转换为 LINQ 表达式(并编译它们)的代码现在已从 F# PowerPack 移至 F# Core 库,因此我认为这是最新版本:
open Microsoft.FSharp.Linq.RuntimeHelpers
LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @>
并将其用于 lambdas
let d=LeafExpressionConverter.EvaluateQuotation <@ fun y -> y+1.0 @>
:?> ( double -> double )
Console.WriteLine(d 10)
产出
11
注意最后的强制转换将 ''obj'' 转换为正确类型的 lambda