Учитывая функцию высшего порядка F# (взятие функции в параметре):
let ApplyOn2 (f:int->int) = f(2)
и функция C#
public static int Increment(int a) { return a++; }
Как я звоню ApplyOn2
с Increment
как параметр (от C#)? Отметьте это ApplyOn2
экспортируется как Microsoft.FSharp.Core.FSharpFunc<int,int>
которые не соответствуют Increment
подпись.
Если вы хотите обеспечить более дружественный интерфейс, рассмотрите возможность использования делегата System.Func, набрав непосредственно на F#:
let ApplyOn2 (f : System.Func<int, int>) = f.Invoke(2)
Вы сможете очень легко вызвать функцию F# на C#, например, так:
MyFSharpModule.ApplyOn2(Increment); // 3
Однако, есть проблема с функцией Increment в том виде, в каком вы ее написали. Чтобы Ваша функция вернула правильный результат, Вам нужна префиксная форма оператора инкремента:
public static int Increment(int a) { return ++a; }
Для получения FSharpFunc из эквивалентной функции C# используйте:
Func<int,int> cs_func = (i) => ++i;
var fsharp_func = Microsoft.FSharp.Core.FSharpFunc<int,int>.FromConverter(
new Converter<int,int>(cs_func));
Для получения функции C# из эквивалентной 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)));
Просто создайте ссылку на вашу сборку:
#r @"Path\To\Your\Library.dll"
let ApplyOn2 (f:int->int) = f(2)
ApplyOn2 Library.Class.Increment