对于 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
我是 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