Использование делегатов c # с функциями f # - PullRequest
6 голосов
/ 31 января 2012

Я пытаюсь вызвать функцию c # из f #, где функция c # принимает функцию (делегат?) В качестве параметра, и мне нужно, чтобы этот аргумент был функцией f #. Например:

Образец c #

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

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

Итак, call_func имеет параметр типа void fn(double, ref double)

В ф # я попробовал:

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)

Но я получаю ошибку, что f # function_1 имеет тип double -> double byref -> unit, когда это должен быть тип делегата void fn(double, ref double).

Могу я разыграть тип или что-то в этом роде? Или есть ошибка?

1 Ответ

9 голосов
/ 31 января 2012

Если вы хотите создать делегата из функции в F #, вы можете использовать оператор new и дать ему функцию в качестве аргумента:

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

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

Но для какая-то причина, если попытаться использовать тот же подход с делегатом, который содержит ref, вы получите эту ошибку:

Это значение функции используется для создания типа делегата, сигнатура которого включает byrefаргумент.Вы должны использовать явное лямбда-выражение, принимающее 2 аргумента.

Итак, если вы следуете совету, приведенному в сообщении об ошибке, вы можете написать следующее:

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))

Компилируетсяи работает как положено.

Обратите внимание, что для изменения параметра y необходимо использовать оператор <-.Использование let y = 6.0 объявляет совершенно другую переменную, которая скрывает параметр.

...