为n(3个或更多)参数的函数进行求值?

时间:2015-11-05 18:57:38

标签: haskell lisp currying

对于具有三个或更多参数的函数,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。但这是咖喱应该是怎样的?

1 个答案:

答案 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)