我对这个方案评估做错了什么?

时间:2008-10-30 07:34:39

标签: lambda scheme evaluation

评估:

((((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 - > ?

然后我被困住了。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

-substitute 3 -> x in (lambda (y) (lambda (x) (+ x y))
-(lambda (y) (lambda (x) (+ 3 y))

首先,这是错误的。您不会将3替换为x的所有匹配项,仅针对免费的x。你在这里替换的5受内部lambda表达式的约束,因此不是自由的。

其次,将值替换为从未使用的变量没有任何问题,因此在y中用(+ 3 4)代替(+ 3 4)就可以了,并且产生{{1}}。

答案 2 :(得分:1)

你的第一次替换是错误的; x中的(+ x y)由最里面的lambda绑定,而不是最外面的(lambda (y) (lambda (x) (+ x y)))。这意味着该替换的结果只是3(lambda (y) (7))“丢失”。 (也许你应该查找替换规则并逐步应用它们以更好地掌握它。)

无论如何,要完成此操作,您仍然可以将(lambda (y) (+ 4 x))(或5如果您修正上述内容)应用于7以获得(+ 4 5)(或{{1} }评估为9)。