我想知道这个代码在Scheme中的含义:
(define ((K x) y) x)
(define (((S x) y) z)
((x z) (y z)))
整个文件为here。
这是合法的计划吗? (K x)是一个参数化函数,类似Java中的泛型函数吗?我查了MIT Scheme reference,似乎没有提到这种定义。
答案 0 :(得分:2)
在麻省理工学院计划中尝试
(define ((K x) y) x)
;Value: k
((k 3) 4)
;Value: 3
显然,这些是来自combinatorial logic SKI calculus的K
和S
组合子的定义。
我们可以明确定义相同的功能,
(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
这就是currying语言(例如Haskell)的工作原理,其中每个函数都是一个参数的函数。在这方面,Haskell非常接近组合逻辑,根本没有使用括号,我们可以简单地写出相同的定义
_K x y = x
_S x y z = x z (y z)
_S (+) (1+) 3
生成7
。
答案 1 :(得分:1)
它被称为 Curried Function Shorthand 并描述了here。