我有一个c#dll库,其中一个方法g
接受C#中的以下函数f
作为输入
void f(double[] x, ref double func, double[] grad, object obj)
在函数体中,func
和grad
值都会更新。 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
之类的名称。
答案 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句柄。