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)