scheme - "The Little Schemer"中的 Y 组合器讨论

标签 scheme combinators y-combinator the-little-schemer

所以,我花了很多时间阅读和重读 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”。
然后单击步进按钮(绿色三角形后跟一个条形)。

这是第一步的样子:

enter image description here

然后为第二个函数做一个例子,看看哪里出了问题。

关于scheme - "The Little Schemer"中的 Y 组合器讨论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10499514/

相关文章:

scheme - 报价单和列表有什么区别?

python - python3中使用局部变量的类似类的闭包

scheme - 从列表中选择一个元素

function - 函数的参数太多

javascript - 这在 Observable TC-39 提案中意味着什么?

haskell - 在 Haskell 中实现 Smullyan 的算术鸟

javascript - Y-combinator 如何以编程方式计算不动点?

lambda - 带有 Y 组合器的列表函数不递归,为什么?

clojure - 定点组合器的用法?为什么这里堆栈溢出?