使用n(3个或更多)参数的函数?

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是三元组,而不是对。带有fnn元组的函数也会出现相同的问题。

一种解决方案可能是等于(x,y,z)(x,(y,z)),然后curry似乎适用。然后curry f3 = (f3 x)是类型(Y,Z) -> U。但这应该是咖喱吗?

Jos*_*lor 3

如果柯里化操作被视为一个高阶函数,它不能直接应用于 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)