【问题标题】:Little Schemer: length0 and mk-lengthLittle Schemer:length0 和 mk-length
【发布时间】:2013-11-12 07:17:36
【问题描述】:

小计划者在page 165 上给出以下内容,仍然是函数length0。但这是如何工作的?看起来 length lambda 正在传递给 mk-length lambda,它使用 length lambdalength lambda /em> 本身作为参数传递。因此,当评估底部的 (length (cdr l)) 时,length 只是 length lambda 本身。但是 length lambda 需要两个参数:lengthl。那么(length (cdr l)) 有什么意义呢?

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (length (cdr l))))))))

【问题讨论】:

  • 正确;它没有。它将(lambda (l) ...) 返回到add1,从而导致错误;这就是为什么它是length_0:它只适用于空列表。而且length 这个名字也是错误的,它真的应该叫mk-length——事实上,在那个框架的右半边。

标签: scheme the-little-schemer


【解决方案1】:

The Little Schemer 正在构建一个适用于越来越长的列表的函数。 length≤0 的部分意义在于它仅适用于长度小于或等于零的列表(并且由于没有负长度列表,这意味着长度为零的列表)。您有意显示的代码仅适用于长度为零的列表。其实这点在page 165上的文中也指出了:

A:如果我们现在可以创建另一个 mk-lengtheternity 的应用程序会怎样?
B : 那只会把问题推迟到一个人身上,而且,我们怎么能这样做呢?
A: 好吧,既然没有人关心我们传递给 mk- 的函数是什么——长度 我们最初可以传递它mk-length
B:这是正确的想法。然后我们在 eternity 上调用 mk-length 并在 cdr 上调用这个结果,这样我们就可以得到更多的塔。答:那么这仍然是length0

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (length (cdr l))))))))

B: 是的,我们甚至可以使用 mk-length 代替 length

((lambda (mk-length)
   (mk-length mk-length))
 (lambda (mk-length)
   (lambda (l)
     (cond
       ((null? l) 0)
       (else (add1
                (mk-length (cdr l))))))))

A:我们为什么要这样做?
B:所有名称都是平等的,但有些名称比其他名称更平等。
A: 是的:只要我们一致地使用名称,我们就可以了。
B:mk-length 远不止于此与 长度 相同的名称。如果我们使用像 mk-length 这样的名称,它会不断提醒 mk-length 的第一个参数是 mk-length

page 166 上,作者展示了一个适用于长度为 0 或 1(即≤1)的列表的版本。最后,在page 167 上,他们得到了一个适用于任何长度列表的版本。 that 的工作原理在另一个问题中有更详细的描述:

您可能还会发现以下感兴趣的问题:

【讨论】:

  • 从之前的示例中,我会认为仅适用于长度 0 意味着对于任何非空列表,它将永远进入递归。击中永恒而失败,而不是因为动态类型的原因而失败。但是,如果由于非空列表的动态键入原因而失败,我确实觉得考虑“有效”是很奇怪的。
  • @user782220 是的,“作品”在这里有点奇怪。重要的是要记住代码不是对已经工作的代码的持续改进和重构;这本书呈现了一段苏格拉底式的对话,经过一系列的尝试,最终的代码逐渐被梳理出来。
猜你喜欢
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多