当我执行以下操作时会发生什么?
(define ((func x) y)
(if (zero? y)
((func x) 1)
12))
我知道我可以做到:
(define curried (func 5))
现在我可以使用 curry 了。我很好奇的是函数的定义。行吗
((func x) 1)
以 x 作为参数创建一个新的 lambda,然后在 1 上调用它?或者它比那更聪明,它只是重新使用现有的。 (例如,如果我执行 (curried 0)
,则 ((func x) 1)
行将等效于 (curried 1)
- PLAI 方案会这样做吗?)
最佳答案
在Scheme标准中规定
(define (f x) 42) is short for (define f (lambda (x) 42)) .
自然(非标准)泛化意味着:
(define ((f x) y) (list x y)) is short for (define (f x) (lambda (y) (list x y)))
which is short for (define f (lambda (x) (lambda (y) (list x y))))
为了测试它,让我们试试 DrScheme 中的例子
欢迎使用 DrScheme,版本 4.1.3.3-svn5dec2008 [3m]。 语言:模块;内存限制:384 兆字节。
(define ((f x) y) (list x y)) (f 1)
((f 1) 2) (1 2)
如果我们命名临时值,可能更容易看到发生了什么:
(define h (f 1)) (h 2) (1 2) (h 3) (1 3)
既然“PLAI Scheme”是在DrScheme中实现的,我相信它继承了这个快捷符号。
关于programming-languages - Scheme 中 Curried 函数的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/357353/