Ответ 1
Укороченная версия
var tupleLogger = FuncConvert.ToFSharpFunc<Tuple<string,string>>(t=>Print(t.Item1,t.Item2));
var logger = FuncConvert.FuncFromTupled(tupleLogger);
MyOtheProject.MyModule.Fetch(logger, 3);
Длинная версия
Функции F # принимают только один аргумент. Несколько аргументов по существу создают вложенные функции. Вам нужно сделать то же самое на стороне С#.
Проверьте тип параметра logger
в С# с Intellisense. Это
Microsoft.FSharp.Core.FSharpFunc<string, Microsoft.FSharp.Core.FSharpFunc<string, a>>
FuncConvert.ToFSharpFunc не может создать это. FuncFromTupled, хотя может создать это из FSharpFunc, который берет Tuple с несколькими полями в качестве аргумента.
Это то, что может быть создано ToFsharpFunc:
FSharpFunc<Tuple<string,string>,Unit> tupleLogger = FuncConvert.ToFSharpFunc<Tuple<string,string>>(
t=> Print(t.Item1,t.Item2));
или же
var tupleLogger = FuncConvert.ToFSharpFunc<Tuple<string,string>>(t=> Print(t.Item1,t.Item2));
Как FuncFromTupled
описании FuncFromTupled
, это A utility function to convert function values from tupled to curried form.
, tupleLogger
- это форма, которую мы должны преобразовать в карри.
var logger = FuncConvert.FuncFromTupled(tupleLogger);
Полученный код выглядит так:
var tupleLogger = FuncConvert.ToFSharpFunc<Tuple<string,string>>(t=>Print(t.Item1,t.Item2));
var logger = FuncConvert.FuncFromTupled(tupleLogger);
MyOtheProject.MyModule.Fetch(logger, 3);
Вы можете создать функцию утилиты для объединения двух преобразований:
public static class MyFuncConvert
{
public static FSharpFunc<T1, FSharpFunc<T2, Unit>> ToFSharpFunc<T1, T2>(Action<T1, T2> action)
{
var tupled = FuncConvert.ToFSharpFunc<Tuple<T1, T2>>(
t => action(t.Item1, t.Item2));
var curried = FuncConvert.FuncFromTupled(tupled);
return curried;
}
}
Что позволит вам написать:
var logger = MyFuncConvert.ToFSharpFunc<string,string>(Print);