0

评估:

((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

这就是我所做的:

  • 评估((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

    • 评估5 -> 5
  • 评估(((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4)

    • 评估4 -> 4
  • 评估((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3)

    • 评估3 -> 3
  • (lambda (x) (lambda (y) (lambda (x) (+ x y))))->(lambda (x) (lambda (y) (lambda (x) (+ x y))))

  • 适用(lambda (x) (lambda (y) (lambda (x) (+ x y))))3

    • 替代3->x(lambda (y) (lambda (x) (+ x y))

    • (lambda (y) (lambda (x) (+ 3 y))

    • 评估(lambda (y) (lambda (x) (+ 3 y)) -> (lambda (y) (lambda (x) (+ 3 y))

    • apply (lambda (y) (lambda (x) (+ 3 y))4

    • 4 -> y(lambda (y) (lambda (x) (+ 3 y))

    • (lambda (y) (+ 3 4))

    • 评估(lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • 替代5->?

然后我被卡住了。

4

3 回答 3

2

我建议您将其分解为单独的“已定义”程序。

(define part1 (lambda (y) (lambda (x) (+ x y)))) ; basically an adder
(define part2 (lambda (x) part1))  ; just return part1, x has no effect

现在打电话(((part2 3) 4) 5) => 9

于 2008-10-30T07:48:19.817 回答
1
-substitute 3 -> x in (lambda (y) (lambda (x) (+ x y))
-(lambda (y) (lambda (x) (+ 3 y))

首先,这是错误的。您不会替换3所有出现的x,只替换免费的。x您在此处替换的内容受内部 lambda 表达式的约束,因此不是免费的。

5其次,将值替换为从未使用过的变量并没有错,因此替换yin(+ 3 4)很好并且 yield (+ 3 4)

于 2008-10-30T08:04:28.707 回答
1

你的第一个替换是错误的;xin受(+ x y)最内层约束lambda,而不是最外层约束。这意味着该替换的结果是 just (lambda (y) (lambda (x) (+ x y)))。这3是“丢失”。(也许您应该查找替换规则并逐步应用它们以更好地掌握它。)

无论如何,要完成,您仍然可以申请(lambda (y) (7))(或者(lambda (y) (+ 4 x))如果您修复上述问题)5来获取7(或(+ 4 5)评估为9)。

于 2008-10-30T08:05:41.933 回答