Using c# delegates with f# functions

北城以北 提交于 2019-12-17 20:21:29

问题


I am trying to call a c# function from f# where the c# function takes a function (delegate?) as a parameter and I need this argument to be a f# function. Eg:

Sample c#

public static void function_1(double x, ref double y)
{
    y = Math.Exp(x);
}

main()
{ 
    state s;
    call_func(s, function_1)
}

So, call_func has a parameter of type void fn(double, ref double)

In f# I tried:

let function_1 (x:double) (y:double byref) = 
    let y = 6.0
    ()

let test = 
    let s = new state
    let ret = call_func(s, function_1)

But I get the error that the f# function_1 has type double -> double byref -> unit when it should be the type of the delegate void fn(double, ref double).

Can I cast the type or something like that? Or is there an error?


回答1:


If you want to create a delegate from a function in F#, you can use the new operator and give it the function as an argument:

let function_1 (x:double) (y:double) = 
    ()

Program.call_func(s, new Action<double, double>(function_1))

But, for some reason, if try to use the same approach with a delegate that contains ref, you get this error:

This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking 2 arguments.

So, if you follow the advice given by the error message, you can write the following:

let function_1 (x:double) (y:double byref) = 
    y <- 6.0

Program.call_func(s, new fn(fun x -> fun y -> function_1 x &y))

This compiles, and works as expected.

Note that to modify the parameter y, you have to use the <- operator. Using let y = 6.0 declares completely different variable that shadows the parameter.



来源:https://stackoverflow.com/questions/9077804/using-c-sharp-delegates-with-f-functions

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!