对于具有三个或更多参数的函数,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)
如果将咖喱操作视为高阶函数,则它不能直接应用于f3,因为咖喱需要类型(X,Y)的函数 – > Z,f3的参数是三元组,而不是一对.同样的问题出现在一个带有n元组的函数fn中.
一种解决方案可能是等同于(x,y,z)和(x,(y,z)),然后咖喱似乎适用.然后咖喱f3 =(f3×)是(Y,Z) – >的类型. U.但这是咖喱应该是怎样的?
最佳答案
If the curry operation is treated as a higher order function, it can’t directly apply to f3, because curry expects a function of type (X,Y) -> Z, and the argument of f3 is a triple, not a pair. The same issue arises with a function fn that takes an n-tuple.
你的问题的某些方面包括大多数在大多数Lisp中都没有的Haskell强类型.例如,一个简单的n-ary咖喱可以定义为:
(defun curry (function first-argument)
(lambda (&rest args)
(apply function first-argument args)))
CL-USER> (let ((f (curry (curry (lambda (x y z)
(* x (+ y z)))
2)
3)))
(mapcar f '(1 2 3 4 5)))
; (8 10 12 14 16)