为什么关闭使用似乎是“鸡或鸡蛋”

时间:2014-10-22 16:53:54

标签: scheme lambda-calculus

我已经阅读并且有点了解Use of lambda for cons/car/cdr definition in SICP。我的问题是了解背后的原因。我的第一个问题是凝视和盯着

(define (cons x y)
 (lambda (m) (m x y)))

并且不了解这个功能实际上是如何进行的。我从各种Lisp / Scheme书中学到的东西就是把东西放在列表中,即

(cons 1 ()) => (1)

怎么做

(define (cons x y)
 (lambda (m) (m x y)))

做点什么?但随着光线在我脑海中浮现:cons只是一种占位符,用于最终定义汽车和cdr。所以汽车是

 (define (car z)
   (z (lambda (p q) p)))

它预计会有一个传入的z。但这是什么z?当我看到这个用途时:

 (car (cons 1 2))

我终于明白了,是的,完整的cons功能是z,即我们将缺点传递给汽车!多奇怪啊!

((lambda (m) (m 1 2)) (lambda (p q) p)) ; and then
((lambda (p q) p) 1 2)

导致抓取第一个表达式,因为基本的汽车操作可以被认为是布尔值为true的if语句,因此,抓住第一个表达式。

是的,所有列表都可以被视为一起表达,但是我们通过这个奇怪的后向定义获得了什么?好像任何最初的,独立的利弊定义都没有密切关系。好像使用某些东西来定义某些东西,好像没有某些东西,直到它的使用限制它为止。这是封闭的主要用途吗?有人可以给我一些其他的例子吗?

1 个答案:

答案 0 :(得分:1)

  

但是我们通过这种奇怪的落后定义获得了什么?

练习的目的是证明数据结构可以完全根据功能定义;数据结构不一定是语言中的原始构造 - 如果你有函数(即闭包),那就足够了。这显示了函数的强大功能,对于来自函数式编程之外的人来说可能是令人难以置信的。

在实际项目中,我们不会以这种方式实际定义数据结构。使用语言提供的数据结构构造会更有效。但知道我们可以这样做是非常重要的。在计算机科学中,能够减少"是有用的。一个构造(数据结构)到另一个构造(函数)中,这样如果我们证明第二个构造的某些东西,它也适用于第一个构造。

相关问题