首页 > 解决方案 > 如何获得 lambda 表达式的规范化形式?

问题描述

出于某种目的,我需要对数字进行Church 编码,因此我将数字定义如下:

# Let's define zero
zero = lambda f: lambda x: x

# A successor function
successor = lambda n: lambda f: lambda x: f(n(f)(x))

# Now I can define any number inductively/recursively
one = successor(zero)
two = successor(successor(zero))

现在,如果我尝试打印 、 等的来源onetwo则完整的表达式不会简化为它们的正常形式:

import inspect;
print(inspect.getsource(zero))
print(inspect.getsource(one))
print(inspect.getsource(two))

输出:

zero = lambda f: lambda x: x
succ = lambda n: lambda f: lambda x:  n(f)(x)
succ = lambda n: lambda f: lambda x:  n(f)(x)

我怎样才能看到最里面的 lambda 的主体onetwo被简化为规范化形式(评估?)的简化形式,即我可以区分简化表达式onetwo.

作为参考,oneand的等价形式two如下:

zero = lambda f: lambda x: x
one = lambda f: lambda x: f(x)
two = lambda f: lambda x: f(f(x))

但我无法从inspect.getsource. 当然,我不想要逐字对等,但仍然能够在 and 中显示不同嵌套级别的one东西two

标签: pythonlambdainspect

解决方案


对于这种特殊情况,您可以将新的 lambda 函数作为参数传递给onetwo返回具有正确堆叠级别的字符串。但是,它没有为您提供 lambda 输入 ( lambda f: lambda x:) 的形式。

zero(lambda x: f'f({x})')('x')
# returns:
'x'

one(lambda x: f'f({x})')('x')
# returns:
'f(x)'

two(lambda x: f'f({x})')('x')
# returns:
'f(f(x))'

推荐阅读