【发布时间】:2015-11-05 18:57:38
【问题描述】:
对于具有三个或更多参数的函数,currying 如何工作?
我搜索了 SO 和 Google。例如给出的具体例子What is 'Currying'? ; https://en.wikipedia.org/wiki/Currying 是关于二进制函数 f (x, y)。
在这种情况下,g = curry f 接受一个参数并生成一元函数(f x)。
我的问题是:
我们如何将其一致地扩展到 n 参数函数,例如f3 (x,y,z)? (f3: X->Y->Z->U)
如果curry操作被视为高阶函数,它不能直接应用于f3,因为curry需要一个(X,Y) -> Z类型的函数,而f3的参数是一个三倍,不是一对。采用 n 元组的函数 fn 也会出现同样的问题。
一种解决方案可能是将(x,y,z) 和(x,(y,z)) 等同起来,然后curry 似乎适用。那么curry f3 = (f3 x) 的类型是(Y,Z) -> U。但是咖喱应该是这样的吗?
【问题讨论】:
-
你可能喜欢元组包,特别是
Data.Tuple.Curry。如果您的回答是“严重!”,那么您并不孤单。 -
@DanielWagner 我笑了。有时我希望将元组定义为
T a1 (T a2 ..))和data T a b = T a !b,可能进行一些特别优化以恢复良好的性能。 -
Racket 的实现很有意思:docs.racket-lang.org/reference/…
-
我推出了自己的
uncurry3和uncurry4函数;我还没有找到 5+ 的需求。