2008-10-30 22 views
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 - >?

然后我卡。

回答

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
-substitute 3 -> x in (lambda (y) (lambda (x) (+ x y)) 
-(lambda (y) (lambda (x) (+ 3 y)) 

首先,这是错误的。对于所有出现的x,您都不能用3替代,只有免费的。您在这里替换的x受内部lambda表达式的约束,因此不是免费的。

第二,有什么不对替代,但从不使用的变量的值,所以在(+ 3 4)y5被罚款和产量(+ 3 4)

1

您的第一个替换是错误的; in (+ x y)受最内层lambda的约束,而不是最外层。这意味着替换的结果只是(lambda (y) (lambda (x) (+ x y)))3是“丢失”。 (也许你应该寻找了替代规则并应用它们一步步吸气剂的一个更好的把握。)

不管这个,才能完成,你仍然可以申请(lambda (y) (7))(或(lambda (y) (+ 4 x))如果您解决以上),以5得到7(或(+ 4 5),其计算结果为9)。