对于具有三个或更多参数的函数,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
。但这是咖喱应该是怎样的?
答案 0 :(得分:2)
如果将咖喱操作视为高阶函数,则不能直接应用于f3,因为咖喱需要类型(X,Y)的函数 - > Z,f3的参数是三元组,而不是一对。同样的问题出现在一个带有n元组的函数fn上。
您的问题的某些方面包含大多数Haskell的强类型,而大多数Lisps中都没有。例如,一个简单的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)