要在c#库中使用的F#函数:使用byref类型委托

时间:2011-06-11 04:05:48

标签: c# .net f#

我有一个c#dll库,其中一个方法g接受C#中的以下函数f作为输入

 void f(double[] x, ref double func, double[] grad, object obj)

在函数体中,funcgrad值都会更新。 F#中g(f)的输入签名读取

f:float[]-> byref<float> -> float[]-> obj->unit

如何在f#中编写f以在f#中使用g(f)

编辑当我按照下面的ildjarn的回答

let f(x:float[]) (func:byref<float>) (grad:float[]) (obj: obj) = 
    func <- ...
    grad.[0] <- ... 
    grad.[1] <- ...
    ...
    ()

我在g(f)

时遇到错误
  

此函数值用于构造其签名包含byref参数的委托类型。您必须使用带有4个参数的显式lambda表达式。

我该怎么做才能让它发挥作用?谢谢。 更新:事实证明我必须使用g(fun (x:float[]) (func:byref<float>) (grad:float[]) (obj: obj) -> ...。无法为内部函数指定f之类的名称。

2 个答案:

答案 0 :(得分:1)

let function1 (x:double[], func:byref<double>, grad:double[], obj:obj) = ...

答案 1 :(得分:1)

将F#函数公开给其他.NET语言的规范方法是使用类,有时是静态类,例如LChart库的设计(link):

Excel Financial functions for .NET是一个用F#编写的项目,是一个通用的.NET库。您可以看到它的公共API是如何编写的。您还可以了解如何将FSharp.Core.dll链接到dll,以便目标计算机不需要安装F#运行时。

<强>更新

ref double func被翻译为f#,let y = ref (func)double[] grad在F#中仅为float[]。请参阅以下示例了解ref

public class tt
{
    public static void temp(int x, ref double[] y)
    {
        y = new double[10];
        y[1] = 10;
    }
}
在F#中

    let y = ref (Array.create 10 0.0)
    tt.temp(0, y)
    printfn "%A" y
    0

请注意temp的第二个参数是ref类型。您只需在F#中使用ref运算符为数组对象创建一个ref句柄。