【问题标题】:Currying for functions with n (3 or more) arguments?为具有 n 个(3 个或更多)参数的函数进行柯里化?
【发布时间】:2015-11-05 18:57:38
【问题描述】:

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

【问题讨论】:

  • 你可能喜欢元组包,特别是Data.Tuple.Curry。如果您的回答是“严重!”,那么您并不孤单。
  • @DanielWagner 我笑了。有时我希望将元组定义为 T a1 (T a2 ..))data T a b = T a !b,可能进行一些特别优化以恢复良好的性能。
  • Racket 的实现很有意思:docs.racket-lang.org/reference/…
  • 我推出了自己的 uncurry3uncurry4 函数;我还没有找到 5+ 的需求。

标签: haskell lisp currying


【解决方案1】:

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

您的问题的某些方面包括大多数 Lisps 中不存在的 Haskell 的大部分强类型。例如,一个简单的 n 元 curry 可以定义为:

(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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多