【发布时间】:2023-03-03 01:12:01
【问题描述】:
如果 expression 计算结果为一个参数的函数,我会认为 lambda x: (expression)(x) 与 expression em> - 但实际上并非如此。考虑 Y 组合子的以下两个定义:
def Y1(F):
left = lambda x: x(x)
right = lambda x: F(x(x))
return left(right)
def Y2(F):
left = lambda x: x(x)
right = lambda x: lambda y: (F(x(x)))(y)
return left(right)
Y2 实际上按预期工作,但调用 Y1 会引发堆栈溢出。为什么会有这种行为差异?
【问题讨论】:
-
一个函数通过一个参数泛化表达式从一个表达式中抽象出来。这样的表达式仅在提供参数时才被评估,即它被延迟评估。添加一个冗余的 lambda 函数正是这种效果。这种技术称为eta abstraction,用于严格评估的语言中以引入惰性。
标签: python lambda functional-programming stack-overflow y-combinator