Назовите высший порядок функцией F# от C#

Учитывая функцию высшего порядка 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подпись.

19
задан CodesInChaos 3 June 2015 в 09:54
поделиться

3 ответа

Если вы хотите обеспечить более дружественный интерфейс, рассмотрите возможность использования делегата 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; }
17
ответ дан 30 November 2019 в 03:08
поделиться

Для получения 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)));
29
ответ дан 30 November 2019 в 03:08
поделиться

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

#r @"Path\To\Your\Library.dll"
let ApplyOn2 (f:int->int) = f(2)
ApplyOn2 Library.Class.Increment
-3
ответ дан 30 November 2019 в 03:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: