Вызовите функцию 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
.
Ответы
Ответ 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