对于 n 参数的 curry 函数,Scheme 中的广义 uncurry 函数是什么?

What is a generalized uncurry function in Scheme, for a curry function of n parameter?

我是 Scheme 的新手,我正在尝试在 Scheme 中设计一个更通用的 uncurry 函数。我试图让它接受一个带有“n”参数的柯里化函数,return 一次将所述函数应用于所有参数的结果。所以像 ((uncurry (curry +)) 1 2 3) 这样的东西可能 return 6.

可以编写一个泛型 uncurry 来调用函数 f,带参数 t,一次一个 -

(define ((uncurry f) . t)
  (if (null? t)
      f
      (apply (uncurry (f (car t)))
             (cdr t))))

(curry +) 上使用它不会起作用,因为 + 是一个 variadic 函数。但是,对于已知数量的功能,它工作得很好 -

(define (plus a b c)
  (+ a b c))

((uncurry (curry plus)) 1 2 3)       ; 6

如果您没有提供所有三个参数,将返回柯里化函数的“余数”-

(((uncurry (curry plus)) 1 2) 3)     ; 6
((((uncurry (curry plus)) 1) 2) 3)   ; 6
(((((uncurry (curry plus))) 1) 2) 3) ; 6

如果以后需要提供额外的参数,可以使用对 uncurry 的后续调用 -

((uncurry ((uncurry (curry plus)) 1)) 2 3) ; 6

但是,如果您尝试应用太多参数,则会引发 运行 时间错误 -

((uncurry (curry plus)) 1 2 3 4)     ; error, expected procedure; 6 given

Is there a way to perform a generalized uncurry function on curried, variadic functions? That was what the question was referring to with "generalized", needs to be able to work on a variable number of arguments.

我建议您查看 molbdnilo 对您的问题的评论。您不能有效地 curry+ 这样的可变参数函数,因为柯里化是元数的抽象。换句话说,如果 + 可以取 0 到无限个参数,那么 (curry +) 应该在它之前取多少应用参数 returns 求和而不是函数?

也许您正在寻找 partial 应用程序?

(define ((partial f . a) . b)
  (apply f (append a b)))
((partial + 1 2)) ; 3
((partial + 1) 2) ; 3
((partial +) 1 2) ; 3