数学联邦政治世界观
超小超大

Haskell和自然数之基础篇(二) (3-2)

我们在前面已经说过,丘奇数的前驱就是从由n 个函数f 组合成的函数中去除一个函数f ,变为由n-1 个函数f 组合成的函数。比如丘奇数的lambda 返回结果是f . f . f,这个丘奇数的前驱的lambda 返回的结果是f . f。最简单的实现就是找到函数f 的反函数f⁻¹,于是有f⁻¹ . f . f .f 等于f . f。但是我们没有办法在Haskell中找到任意一个函数的反函数,看来这个实现方式是行不通的。那既然我们做不到逆转世界,那停止世界是可以的,我们可以使用const x 函数来停止世界,将\x -> \f -> f x 用为\x -> \f -> x 即\x -> const x 来替换,就去除了一次函数f 的作用,相当于没有调用过函数f 。顺着这个思路,我们于是有了如下这个丘奇数前驱的实现。

-- 前驱函数,从n个函数f的组合得到n-1个函数f的组合

predChurch n = Church $ \f x -> runChurch n (\g h -> h (g f)) (const x) id

• 自然数的减法和整除的实现

有了自然数的前驱函数,我们就可以实现减法了。前面说过,自然数没有负数,所以我们需要可以比较两个自然数,当自然数m 小于自然数n 时,m - n 的结果是0 。

我们可以将自然数实现为Eq 和Ord 类型类的实例,就可以比较两个自然数了。Haskell的实现如下:

instance Eq N where

O == O = True

S _ == O = False

O == S _ = False

S n1 == S n2 = n1 == n2

instance Ord N where

O `compare` O = EQ

S _ `compare` O = GT

O `compare` S _ = LT

S n1 `compare` S n2 = n1 `compare` n2

listToN :: [()] -> N

listToN [] = O

listToN (_:xs) = S $ listToN xs

-- 因为有instance Eq (),所以有下面的

-- instance Eq [()]

-- 因为有instance Ord (),所以有下面的

-- instance Ord [()]

churchToN :: Church -> N

churchToN c = runChurch c S O

instance Eq Church where

c1 == c2 = churchToN c1 == churchToN c2

instance Ord Church where

c1 `compare` c2 = churchToN c1 `compare` churchToN c2

我们通过自然数的前驱来实现减法,皮亚诺形式的自然数减法实现如下所示:

minus :: N -> N -> N

minus m n

| m>n = iter m predN n

| otherwise = O

列表形式的自然数减法实现如下所示:

minus :: [()] -> [()] -> [()]

minus m n

数学联邦政治世界观提示您:看后求收藏(同人小说网http://tongren.me),接着再看更方便。

相关小说

不求功名,只求她平安 连载中
不求功名,只求她平安
清梦蝶灵
秋风袭卷大地,洛秋明复约而来,世界已是物是人非,古龙复苏,名为“神”的生物降临人间,百年未有之大变局,斩神与龙的“比罗米修斯”之神终将落下。
1.0万字1个月前
虫族:关于你的救赎 连载中
虫族:关于你的救赎
清明的月
神秘情感缺失雄子X清冷偏执雌虫上将一场奇妙的相遇,让两个截然不同的灵魂绑定在一起。一场未知的救赎,让彼此深陷其中。“以我之心,唤你之名”
2.3万字1个月前
开心超人之暗魔和小心的恋爱 连载中
开心超人之暗魔和小心的恋爱
夜梦韩
作者:本人有一些觉得,暗魔好像和小心很配哦!伽罗:作者,纳命来!作者:啊啊啊啊啊啊!暗魔:伽罗,你的小心归我啦!伽罗:暗魔!暗魔:啊啊啊啊啊......
2.3万字4周前
书忆 连载中
书忆
芝麻糊糊糊不糊
随意写的各种短文,喜欢看就看,不喜欢就拉倒
2.5万字4周前
我穿越古代当祖宗(一) 连载中
我穿越古代当祖宗(一)
豆澄雪
“我穿越了?!还是书里会法术的几千万年前?!”来自女主角妙穗穗的反(质)问(疑)为了寻找自己真爱,穿过万水千山,妙穗穗哭着质疑:“我的真爱,......
5.6万字4周前
漠世医妃 连载中
漠世医妃
白之情
此作品签约,请勿盗取。这部小说呢,是一个比较漫长的故事。得有耐心看下去啊。
9.0万字4周前