lambda演算python实现[二]之数字

lambda演算python实现[二]之数字

原文出处:lambda演算中的数字

python实现

数字和加法的函数表示

数字的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def _0(s,z):
return z

def _1(s,z):
return s(z)

def _2(s,z):
return s(s(z))

def _3(s,z):
return s(s(s(z)))

_4 = lambda s,z:s(s(s(s(z))))
_5 = lambda s,z:s(s(s(s(s(z)))))
_6 = lambda s,z:s(s(s(s(s(s(z))))))
_7 = lambda s,z:s(s(s(s(s(s(s(z)))))))
_8 = lambda s,z:s(s(s(s(s(s(s(s(z))))))))
_9 = lambda s,z:s(s(s(s(s(s(s(s(s(z)))))))))

#add = lambda x,y:lambda s,z:x(s,y(s,z))
def add(x,y):
def curry0(s,z):
return x(s,y(s,z))
return curry0

检验

运行以下函数

1
2
3
4
print(_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
2
3
4
5
6
z = 0
s = lambda x:x+1
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 #瞧!发生作用了,add(_2,_3) 和_5的值一样

数字赋予新的意义

我们也可以用字符”+”的个数来代替我们定义的数字的意义

1
2
3
4
5
6
z="" 
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只要定义的有意义,我们可以做更多的事情

评论