解析lambda函数

时间:2018-02-11 08:13:50

标签: python lambda

这是来自在线的试卷,但它没有有效的解决方案。我无法理解为什么以及如何从这段代码得到答案,例如解析括号的优先级如何。我个人在卡住之前将下面的打印表达式解析为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的基础。我自己学习这个,我对这个主题并不是很了解。感谢。

1 个答案:

答案 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
...

我想你现在明白了。