F#是否有一个帮助函数来转换方法签名?

时间:2014-12-08 16:54:47

标签: f#

为了简化问题,如果有一个没有重载的方法,并且其签名是:Func<int, int, int, int>,那么F#是否有任何帮助函数来获取(fun (a, b, c) -> myFun(a, b, c))签名Func<int * int * int, int> }

1 个答案:

答案 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))