我正在构建一个符号衍生引擎。例如
let f = <@ fun x:double -> x * x @>
let df = der f
,结果表达式为
<@ 2 * x @>
实际的方程式可能是任意复杂的。
使用递归生成衍生物并不太难 模式匹配和转换但最终我想使用 在紧密数值循环中生成的方程就好像我有手一样 写下来。这是数值计算代码,因此总是更快 更好(如果可能的话)
我查看了FSharpX引用编译器,但它看起来像是解释器而不是编译器。
答案 0 :(得分:7)
我没有对此进行过测试,但是将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