我正在构建一个符号衍生引擎。例如
let f = <@ fun x:double -> x * x @>
let df = der f
结果表达式将是
<@ 2 * x @>
实际的方程可能是任意复杂的。
使用递归模式匹配和转换来生成导数并不太难,但最后我想在紧密的数值循环中使用生成的方程,就像我手写它们一样。这是数值计算代码,所以更快总是更好(如果可能的话)
我查看了 FSharpX 引用编译器,但它看起来像解释器而不是编译器。
我正在构建一个符号衍生引擎。例如
let f = <@ fun x:double -> x * x @>
let df = der f
结果表达式将是
<@ 2 * x @>
实际的方程可能是任意复杂的。
使用递归模式匹配和转换来生成导数并不太难,但最后我想在紧密的数值循环中使用生成的方程,就像我手写它们一样。这是数值计算代码,所以更快总是更好(如果可能的话)
我查看了 FSharpX 引用编译器,但它看起来像解释器而不是编译器。
I have not tested this, but the code that translates F# quotations to LINQ expressions (and compiles them) has now moved from F# PowerPack into the F# Core library, so I think that is the most up-to-date version:
open Microsoft.FSharp.Linq.RuntimeHelpers
LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @>
and to use it for lambdas
let d=LeafExpressionConverter.EvaluateQuotation <@ fun y -> y+1.0 @>
:?> ( double -> double )
Console.WriteLine(d 10)
outputs
11
Note the cast at the end to convert the ''obj'' to a lambda of the correct type