为了简化问题,如果有一个没有重载的方法,并且其签名是:Func<int, int, int, int>
,那么F#是否有任何帮助函数来获取(fun (a, b, c) -> myFun(a, b, c))
签名Func<int * int * int, int>
}
答案 0 :(得分:3)
在其他函数式语言中,这通常称为“un-currying”,但F#不包含在核心库中。您可以自己轻松定义该功能:
let uncurry3 f = (fun (a,b,c) -> f a b c)
不幸的是,这不适用于任何个参数 - 你需要为你想要使用的每个参数定义uncurryX
。
在实践中,我可能不会这样做。它可以导致难以读取和调试的无点代码。有时,更多的冗长是有用的:-)如果你最终经常将它应用于某个函数,那么它是一个好的迹象,也许它应该以其他风格定义。
BTW:答案是假设您使用Func
来引用普通的F#函数。如果您指的是.NET Func
委托(而不是函数),那么您可以写:
let uncurry3 (f:Func<_, _, _, _>) =
System.Func<_, _>(fun (a,b,c) -> f.Invoke(a, b, c))