我想知道这段代码在 Scheme 中的含义:
(define ((K x) y) x)
(define (((S x) y) z)
((x z) (y z)))
整个文件在这里。
这是合法的计划吗?(K x) 是参数化函数,类似于 Java 中的泛型函数吗?我查了MIT Scheme 参考,似乎没有提到这种定义。
我想知道这段代码在 Scheme 中的含义:
(define ((K x) y) x)
(define (((S x) y) z)
((x z) (y z)))
整个文件在这里。
这是合法的计划吗?(K x) 是参数化函数,类似于 Java 中的泛型函数吗?我查了MIT Scheme 参考,似乎没有提到这种定义。
在 MIT 计划中尝试它是有效的
(define ((K x) y) x)
;Value: k
((k 3) 4)
;Value: 3
我们可以显式定义相同的函数,
(define k (lambda (x) (lambda (y) x)))
;Value: k
((k 3) 4)
;Value: 3
显然,MIT-Scheme 为我们做到了这一点,就像将常规定义(define (fun foo) bar)
翻译成(define fun (lambda (foo) bar))
.
组合器将S
被明确定义为
(define S (lambda (x) (lambda (y) (lambda (z)
((x z) (y z))))))
(define ((add a) b) (+ a b))
;Value: add
(define (add1 a) (+ a 1))
;Value: add1
(((s add) add1) 3)
;Value: 7
这就是柯里化语言(例如 Haskell)的工作方式,其中每个函数都是一个参数的函数。Haskell 在这方面非常接近组合逻辑,根本没有使用括号,我们可以简单地编写相同的定义
_K x y = x
_S x y z = x z (y z)
这样就_S (+) (1+) 3
产生了7
。
它被称为Curried Function Shorthand并在此处进行了描述。