tin*_*lyx 6 lisp haskell currying
对于具有三个或更多参数的函数,如何currying
工作?
我搜索了SO和Google。例如,什么是“固化”中给出的具体示例?; 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
期望使用type函数(X,Y) -> Z
,并且的参数f3
是三元组,而不是对。带有fn
n元组的函数也会出现相同的问题。
一种解决方案可能是等于(x,y,z)
和(x,(y,z))
,然后curry
似乎适用。然后curry f3 = (f3 x)
是类型(Y,Z) -> U
。但这应该是咖喱吗?
如果柯里化操作被视为一个高阶函数,它不能直接应用于 f3,因为柯里化期望一个类型为 (X,Y) -> Z 的函数,并且 f3 的参数是一个三元组,而不是一个对。采用 n 元组的函数 fn 也会出现同样的问题。
你的问题的某些方面包括大多数 Lisp 中不存在的 Haskell 强类型。例如,一个简单的 n 元咖喱可以定义为:
(defun curry (function first-argument)
(lambda (&rest args)
(apply function first-argument args)))
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)