如何使用F#?</t>中的Expression <t>类型的参数调用C#方法

时间:2009-12-31 23:29:18

标签: f# translation

我正在尝试使用F#中的Brahma库,我需要调用一个以Exprssion为参数的方法,我不知道该怎么做。

这里是我要翻译的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();

Source

2 个答案:

答案 0 :(得分:3)

你需要使用F#引用,但这些引用产生F#表达式(Expr)对象,并且对CLR表达式的转换有点繁琐。

首先将表达式编写为F#引用:

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

现在你需要能将它转换为CLR(LINQ)表达式的东西。我找到了this little helper method by a chap named Michael(找不到全名来表示赞赏,抱歉):

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) 

(注意这取决于F#PowerPack,PowerPack ToLinqExpression方法被认为是实验性的,因此生产代码可能无法接受。)

现在,您只需将ToLinq方法应用于F#表达式,并将结果传递给所需的方法:

let clrExpression = expr |> ToLinq
// pass clrExpression to Compile method

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

答案 1 :(得分:2)

浏览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) = ...
  1. ... / FSharp-1.9.6.2 /源极/ fsharp / FSharp.PowerPack.Linq / Linq.fs
  2. [2,3]的F#报价的高级信息。

    1. http://msdn.microsoft.com/en-us/library/dd233212(VS.100).aspx
    2. http://tomasp.net/blog/fsharp-quotation-samples.aspx