这是来自在线的试卷,但它没有有效的解决方案。我无法理解为什么以及如何从这段代码得到答案,例如解析括号的优先级如何。我个人在卡住之前将下面的打印表达式解析为foo(bar)(8),因为foo应该将第一个参数作为一个值,而将lambda的第二个参数作为一个函数,这种情况下,bar和8都在不同的地方。
def bar(x):
return lambda y: x(x(y))
def foo(y):
return lambda x: x(y)
print((foo(bar)(bar)(lambda x:x*2)(2)))
我希望得到一个详细的答案或任何我可以在此基础上解决lambdas的基础。我自己学习这个,我对这个主题并不是很了解。感谢。
答案 0 :(得分:0)
这更像是一个lambda演算练习而不是Python演练。这是扩展所有定义,简化给定表达式的问题。
foo(bar)(bar)(lambda x:x*2)(2)
# expanding foo(bar)
(lambda x: x(bar))(bar)(lambda x:x*2)(2)
# beta reduction
bar(bar)(lambda x:x*2)(2)
# expanding bar(bar)
(lambda y: bar(bar(y)))(lambda x:x*2)(2)
# beta reduction
bar(bar(lambda x:x*2))(2)
# expanding bar(lambda ...)
bar(lambda y: (lambda x:x*2)((lambda x:x*2)(y)))(2)
# let's call g = lambda y: (lambda x:x*2)((lambda x:x*2)(y))
bar(g)(2)
# expanding bar(g)
(lambda y: g(g(y))(2)
# beta reduction
g(g(2))
# expanding innermost g
g((lambda y: (lambda x:x*2)((lambda x:x*2)(y)))(2))
# beta reduction
g((lambda x:x*2)((lambda x:x*2)(2)))
# beta reduction
g((lambda x:x*2)(2*2))
# arithmetic
g((lambda x:x*2)(4))
# beta reduction
g(4*2)
# arithmetic
g(8)
# expanding g
...
我想你现在明白了。