原文出处:lambda演算中的数字
python实现
数字的定义
1 | def _0(s,z): |
检验
运行以下函数1
2
3
4print(_2)
print(_2)
print(_3)
print(add(_1, _2))
得到:1
2
3
4<function _2 at 0x00611660>
<function _3 at 0x006113D8>
<function _5 at 0x006115D0>
<function add.<locals>.curry0 at 0x006114F8>
你会发现add加法,根本看不出任何信息 ,为什么呢?
原因是我们定义的这些值和add操作都是函数,没有赋值推导就不会发生作用
为了让函数确实能发生变化,我们就要依赖于python的编译器,
只要给这些表示数字的函数赋值,编译器就工作了,递归也就发生了
为了能够清晰示意,我们把z 赋值成0,s也有意义的实现为一个递增函数。
实际上这里的z,s的实现不一定是0和inc递增函数,只是这么实现是为了方便示意
让递归发生
1 | z = 0 |
得到:1
2
3
4_2 : 2
_3 : 3
_5 : 5
add(_2,_3): 5 #瞧!发生作用了,add(_2,_3) 和_5的值一样
数字赋予新的意义
我们也可以用字符”+”的个数来代替我们定义的数字的意义1
2
3
4
5
6z=""
s= lambda x:x+"."
print("_2 :",_2(s,z))
print("_3 :",_3(s,z))
print("_5 :",_5(s,z))
print("add(_2,_3):",add(_2, _3)(s,z))
得到:1
2
3
4_2 : ++ #表示2个“+”号
_3 : +++ #表示3个“+”号
_5 : +++++ #表示5个“+”号
add(_2,_3): +++++ #得到5个“+”号,加法操作确实发生了作用
所以z,s只要定义的有意义,我们可以做更多的事情