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

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

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

и функция С#

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

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

3 ответа

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

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

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

MyFSharpModule.ApplyOn2(Increment); // 3

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

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


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

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

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

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

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

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


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

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

licensed under cc by-sa 3.0 with attribution.