Причина в том, что add экспортируется как обычная функция стиля .Net и имеет грубую подпись
int add(int, int)
C # и большинство языков .Net рассматривают это как метод, который принимает 2 int
параметров и возвращает одно значение int
. F # хотя не видит функции таким образом. Вместо этого он видит add
как функцию, которая принимает int
и возвращает функцию, которая, в свою очередь, получает int
и возвращает int
. Такое представление функций упрощает реализацию таких операций, как каррирование.
Чтобы перейти от представления мира C # к F #, вам нужно сделать немного магии, чтобы сложить метод на себя. Я достигаю этого, определяя набор методов фабрики и расширений F #, чтобы сделать магию для меня. Например
[<Extension>]
type public FSharpFuncUtil =
[<Extension>]
static member ToFSharpFunc<'a,'b,'c> (func:System.Func<'a,'b,'c>) =
fun x y -> func.Invoke(x,y)
static member Create<'a,'b,'c> (func:System.Func<'a,'b,'c>) =
FSharpFuncUtil.ToFSharpFunc func
Я могу использовать эту библиотеку, чтобы получить соответствующий тип делегата F # для метода add
, например:
var del = FSharpFuncUtil.Create<int, int, int>(myFsLibrary.add);