我正在构建一个符号衍生引擎。例如

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!