Подтвердить что ты не робот

Вызовите функцию F # более высокого порядка из С#

Учитывая функцию более высокого порядка F # (взяв функцию в параметре):

let ApplyOn2 (f:int->int) = f(2)  

и функция С#

public static int Increment(int a) { return a++; } 

Как мне называть ApplyOn2 с Increment в качестве параметра (из С#)? Обратите внимание, что ApplyOn2 экспортируется как Microsoft.FSharp.Core.FSharpFunc<int,int>, которые не соответствуют подписке Increment.

4b9b3361

Ответ 1

Если вы хотите предоставить более дружественный опыт взаимодействия, подумайте об использовании типа делегирования System.Func непосредственно в F #:

let ApplyOn2 (f : System.Func<int, int>) = f.Invoke(2)

Вы легко сможете называть свою функцию F # в С# следующим образом:

MyFSharpModule.ApplyOn2(Increment); // 3

Однако существует проблема с функцией Increment, как вы ее написали. Вам нужна префиксная форма оператора инкремента, чтобы ваша функция вернула правильный результат:

public static int Increment(int a) { return ++a; }

Ответ 2

Чтобы получить FSharpFunc из эквивалентной функции С#, используйте:

Func<int,int> cs_func = (i) => ++i;
var fsharp_func = Microsoft.FSharp.Core.FSharpFunc<int,int>.FromConverter(
    new Converter<int,int>(cs_func));

Чтобы получить функцию С# из эквивалентного FSharpFunc, используйте

var cs_func = Microsoft.FSharp.Core.FSharpFunc<int,int>.ToConverter(fsharp_func);
int i = cs_func(2);

Итак, в этом конкретном случае ваш код может выглядеть так:

Func<int, int> cs_func = (int i) => ++i;
int result = ApplyOn22(Microsoft.FSharp.Core.FSharpFunc<int, int>.FromConverter(
            new Converter<int, int>(cs_func)));

Ответ 3

Просто создайте ссылку на свою сборку:

#r @"Path\To\Your\Library.dll"
let ApplyOn2 (f:int->int) = f(2)
ApplyOn2 Library.Class.Increment