3

我想知道这段代码在 Scheme 中的含义:

(define ((K x) y) x)

(define (((S x) y) z)
  ((x z) (y z)))

整个文件在这里

这是合法的计划吗?(K x) 是参数化函数,类似于 Java 中的泛型函数吗?我查了MIT Scheme 参考,似乎没有提到这种定义。

4

2 回答 2

2

在 MIT 计划中尝试它是有效的

(define ((K x) y) x)
;Value: k

((k 3) 4)
;Value: 3

显然,这些是组合逻辑SKI 演算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

这就是柯里化语言(例如 Haskell)的工作方式,其中每个函数都是一个参数的函数。Haskell 在这方面非常接近组合逻辑,根本没有使用括号,我们可以简单地编写相同的定义

_K x y = x
_S x y z = x z (y z)

这样就_S (+) (1+) 3产生了7

于 2013-10-25T08:50:09.943 回答
1

它被称为Curried Function Shorthand在此处进行了描述。

于 2013-10-25T17:15:17.407 回答