python - 如何获得 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))
现在,如果我尝试打印 、 等的来源one
,two
则完整的表达式不会简化为它们的正常形式:
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 的主体one
和two
被简化为规范化形式(评估?)的简化形式,即我可以区分简化表达式one
和two
.
作为参考,one
and的等价形式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
。
解决方案
对于这种特殊情况,您可以将新的 lambda 函数作为参数传递给one
或two
返回具有正确堆叠级别的字符串。但是,它没有为您提供 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))'
推荐阅读
- excel - excel 2016中可以更换IFS吗
- vba - 无法在其他 PC 上的 dotm 文件中运行宏
- javascript - 如何根据来自单元格的值将数据库值加载到表格单元格中?
- dart - PlatformException (PlatformException(sign_in_failed, com.google.android.gms.common.api.ApiException: 12500: , null))
- python - 有没有办法让python和excel交互?
- java - 使用 JAVA 访问 IIB 中的消息内容
- c - 无法写入文件
- expect - 如何在期望中创建一个for循环,通过文件中的所有行运行
- python - 创建和遍历结合来自数据框的唯一值的树
- bazel - 如何引用单个目标文件?