F# 如何从F调用类型为Expression的参数的C方法?

F# 如何从F调用类型为Expression的参数的C方法?,f#,translation,F#,Translation,我正在尝试使用F中的梵天库,我需要调用一个以表达式为参数的方法,我不知道怎么做 下面是我要翻译的C代码: // Create the computation provider var computationProvider = new ComputationProvider(); // Create a data-parallel array and fill it with data var data = new DataParallelArray<float>(computat

我正在尝试使用F中的梵天库,我需要调用一个以表达式为参数的方法,我不知道怎么做

下面是我要翻译的C代码:

// Create the computation provider
var computationProvider = new ComputationProvider();

// Create a data-parallel array and fill it with data
var data = new DataParallelArray<float>(computationProvider, 
    new[] { 0f, 1f, 2f, 3f, 4f, 5f, 6f });

// Compile the query
CompiledQuery query = computationProvider.Compile<DataParallelArray<float>>
(
    d => from value in d
    select value * 2f
);

// Run the query on this data
IQueryable result = computationProvider.Run(query, data);

// Print out the results
foreach (float value in result)
        Console.WriteLine(result[i]);

// Get rid of all the stuff we created
computationProvider.Dispose();
data.Dispose();
result.Dispose();

浏览F源目录[1],我看到:

/// Convert F# quotations to LINQ expression trees.
/// A more polished LINQ-Quotation translator will be published
/// concert with later versions of LINQ.
let rec ConvExpr env (inp:Expr) = ...
…/FSharp-1.9.6.2/source/FSharp/FSharp.PowerPack.Linq/Linq.fs [2,3]中有关F报价的高级信息


您需要使用F引号,但这些引号会生成F expression Expr对象,并且到CLR表达式的转换有点繁琐

首先将表达式写成F引号:

let expr = <@ fun (d : DataParallelArray<float>) -> d.ToString() @>  // real implementation omitted

这对我来说是一个简单的测试;您可能需要提供一些额外的类型提示,我还没有尝试从实际代码中翻译序列表达式。

需要注意的一点是,至少在电源组的v1.9.7.8中,ConvXPR不是QuotationEvaluation模块接口的一部分。当我尝试使用ConvXPR时,我遇到了一个编译器错误。模块接口通过Expr.ToLinqExpression扩展方法显示它。
open Microsoft.FSharp.Quotations
open Microsoft.FSharp.Linq.QuotationEvaluation
open System.Linq.Expressions

let ToLinq (exp : Expr<'a -> 'b>) =
    let linq = exp.ToLinqExpression()
    let call = linq :?> MethodCallExpression
    let lambda = call.Arguments.[0] :?> LambdaExpression
    Expression.Lambda<Func<'a, 'b>>(lambda.Body, lambda.Parameters) 
let clrExpression = expr |> ToLinq
// pass clrExpression to Compile method