所以,我花了很多时间阅读和重读 The Little Schemer 第 9 章的结尾,其中应用 Y 组合器是为 length
开发的。功能。我认为我的困惑归结为一个对比两个版本的长度的声明(在组合器被分解之前):
A:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1
((mk-length mk-length)
(cdr l))))))))
B:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
((lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1 (length (cdr l)))))))
(mk-length mk-length))))
Page 170 (4th ed.)指出 A
returns a function when we applied it to an argument
而乙
does not return a function
从而产生自我应用的无限倒退。我被这件事难住了。如果 B 受到这个问题的困扰,我看不出 A 是如何避免的。
最佳答案
要查看会发生什么,请使用 DrRacket 中的步进器。
步进器允许您查看所有中间步骤(并来回走动)。
将以下内容粘贴到 DrRacket:
(((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0 )
(else (add1
((mk-length mk-length)
(cdr l))))))))
'(a b c))
然后选择教学语言“Intermediate Student with lambda”。
然后单击步进按钮(绿色三角形后跟一个条形)。
这是第一步的样子:
然后为第二个函数做一个例子,看看哪里出了问题。
关于scheme - "The Little Schemer"中的 Y 组合器讨论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10499514/