Haskell 是否对具有n(3个或更多)参数的函数进行Currying?

Haskell 是否对具有n(3个或更多)参数的函数进行Currying?,haskell,lisp,currying,Haskell,Lisp,Currying,对于具有三个或三个以上参数的函数,currying如何工作 我搜索了SO和Google。例如中给出的具体示例;是关于二进制函数的f(x,y) 在这种情况下,g=curry f接受一个参数并生成一元函数(fx) 我的问题是: 我们如何将其一致地扩展到n参数函数,例如f3(x,y,z)?(f3:X->Y->Z->U) 如果curry操作被视为一个高阶函数,它不能直接应用于f3,因为curry需要一个类型为(X,Y)->Z的函数,f3的参数是一个三元组,而不是一对。采用n元组的函数fn也会出现同样的问

对于具有三个或三个以上参数的函数,
currying
如何工作

我搜索了SO和Google。例如中给出的具体示例;是关于二进制函数的
f(x,y)

在这种情况下,
g=curry f
接受一个参数并生成一元函数
(fx)

我的问题是:

我们如何将其一致地扩展到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 f3=(f3x)
的类型是
(Y,Z)->U
。但是咖喱应该是这样的吗

如果curry操作被视为一个高阶函数,它不能直接应用于f3,因为curry需要一个类型为(X,Y)->Z的函数,并且f3的参数是三元组,而不是一对。采用n元组的函数fn也会出现同样的问题

您的问题中有许多方面包括大多数Lisp中不存在的Haskell的强类型。例如,简单的n元咖喱可以定义为:

(defun curry (function first-argument)
  (lambda (&rest args)
    (apply function first-argument args)))


您可能特别喜欢tuple包。如果你的回答是“恶心!”,那么,你并不孤单。有时我希望元组被定义为
ta1(ta2..)
数据tab=ta!b
,可能通过一些特别的优化来恢复良好的性能。Racket的实现很有趣:我已经推出了自己的
uncurry3
uncurry4
函数;我还没有找到5+的需求。
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)