评估:
((((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
- > ?然后我被困住了。
答案 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
)。