计算中的Curried函数的实现

Cla*_*diu 2 scheme programming-languages currying racket

当我执行以下操作时会发生什么?

(define ((func x) y)
    (if (zero? y)
        ((func x) 1)
        12))
Run Code Online (Sandbox Code Playgroud)

我明白我可以这样做:

(define curried (func 5))
Run Code Online (Sandbox Code Playgroud)

而现在我可以使用咖喱.我很好奇的是函数的定义.是行吗?

((func x) 1)
Run Code Online (Sandbox Code Playgroud)

用x作为参数创建一个新的lambda,然后在1上调用它?或者它比那更聪明,它只是重新使用现有的.(例如,如果我这样做(curried 0),该((func x) 1)行将等同于(curried 1)- PLAI Scheme是否这样做?)

soe*_*ard 8

在Scheme标准中指定了

(define (f x) 42) is short for (define f (lambda (x) 42)) .
Run Code Online (Sandbox Code Playgroud)

自然(非标准)概括意味着:

(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))))
Run Code Online (Sandbox Code Playgroud)

为了测试它,让我们尝试DrScheme中的示例

欢迎使用DrScheme,版本4.1.3.3-svn5dec2008 [3m].语言:模块; 内存限制:384兆字节.

(define((fx)y)(list xy))(f 1)

((f 1)2)(1 2)

如果我们命名临时值,可能更容易看到发生了什么:

(定义h(f 1))(h 2)(1 2)(h 3)(1 3)

由于"PLAI Scheme"在DrScheme中实现,我相信它继承了这种快捷方式.