bra*_*ing 7 f# compilation quotations
我正在构建一个符号衍生引擎.例如
let f = <@ fun x:double -> x * x @>
let df = der f
Run Code Online (Sandbox Code Playgroud)
结果表达式将是
<@ 2 * x @>
Run Code Online (Sandbox Code Playgroud)
实际的方程式可能是任意复杂的.
使用递归模式匹配和变换,衍生物的生成并不太难,但最后我想在紧密数值循环中使用生成的方程式,就像我手写它们一样.这是数值计算代码,所以更快总是更好(如果可能的话)
我看过FSharpX报价编译器,但它看起来像是一个解释器而不是编译器.
我没有测试过这个,但是将F#引用转换为LINQ表达式(并编译它们)的代码现在已经从F#PowerPack转移到F#Core库中,所以我认为这是最新版本:
open Microsoft.FSharp.Linq.RuntimeHelpers
LeafExpressionConverter.EvaluateQuotation <@ 1 + 2 @>
Run Code Online (Sandbox Code Playgroud)
并将它用于lambdas
let d=LeafExpressionConverter.EvaluateQuotation <@ fun y -> y+1.0 @>
:?> ( double -> double )
Console.WriteLine(d 10)
Run Code Online (Sandbox Code Playgroud)
输出
11
Run Code Online (Sandbox Code Playgroud)
注意最后的转换将''obj''转换为正确类型的lambda