programming-languages - Scheme 中 Curried 函数的实现

标签 programming-languages scheme racket currying

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

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

相关文章:

lisp - 是否有实现条件重启系统的书籍/指南

racket - 垂直条可以用作 Racket 中标识符的一部分吗?

iphone - MacRuby 的优点/限制是什么?有人用它为 iPhone 编程吗?

windows - 小型桌面应用程序,简单的 GUI,易于部署 : language/framework choices?

ruby-on-rails - ruby 如何允许同名的方法和类?

programming-languages - SML: "Behind the scenes"不可变变量?

Scheme、SICP、R5RS,为什么delay不是特殊形式?

functional-programming - 在 Racket 中定义错误

方案:获取不带括号的 cdr

algorithm - 尝试字节编译时提高 Racket 代码的性能和错误