将表单定义为函数名称?

时间:2013-10-25 08:16:37

标签: function scheme definition combinators combinatory-logic

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

(define ((K x) y) x)

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

整个文件为here

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

2 个答案:

答案 0 :(得分:2)

在麻省理工学院计划中尝试

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

((k 3) 4)
;Value: 3

显然,这些是来自combinatorial logic SKI calculusKS组合子的定义。

我们可以明确定义相同的功能,

(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