短版
var tupleLogger = FuncConvert.ToFSharpFunc<Tuple<string,string>>(t=>Print(t.Item1,t.Item2));
var logger = FuncConvert.FuncFromTupled(tupleLogger);
MyOtheProject.MyModule.Fetch(logger, 3);
加长版
F# 函数只接受一个参数。多个参数本质上创建嵌套函数。你需要在 C# 方面做同样的事情。
使用 Intellisense 检查 C# 中 logger 参数的类型。这是
Microsoft.FSharp.Core.FSharpFunc<string, Microsoft.FSharp.Core.FSharpFunc<string, a>>
FuncConvert.ToFSharpFunc 不能创建这个。 FuncFromTupled 虽然可以从 FSharpFunc 创建它,该 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 的描述所说,它是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);