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

Haskell和自然之代数篇 (5-1)

在上一篇文章 parker liu:Haskell和自然数之基础篇中,我们定义了什么是自然数,给出了自然数的几种定义形式。在这篇文章中,我们继续来探讨自然数,看看自然数的代数结构,自然数和递归、幺半群、F-代数、自由幺半群的关系。

我们再来看一下自然数的定义:

data N = O

| S N -- 使用了递归定义

deriving (Show)

我们可以看到,在这个定义里使用了递归的方式来定义自然数,其中S N是递归步,O是递归的终止。自然数具有一个递归形式,递归层数就是该自然数的大小。于是我们就有了自然数类型N 的形式定义。

我们可以写这么一个函数来将上面定义的自然数N 转换为我们常见的正整数。

nToInt :: N -> Int

nToInt O = 0

nToInt (S n) = 1 + nToInt n

--- 在ghci中的运行结果如下

> nToInt (S (S (S O))

3

也可以写这么一个函数,将上面定义的自然数N 转换为字母a 组成的字符串。

nToCharAs :: N -> [Char]

nToCharAs O = []

nToCharAs (S n) = 'A' : nToCharAs n

--- 在ghci中的运行结果如下

> nToCharAs (S (S (S O))

"AAA"

可以看到这两个函数的实现非常的相似,有着同样的结构。如果我们对自然数的定义稍作修改,将自然数N 的构造子S 变换为Cons (),上面的函数的实现就有着更直观的对应。我们来看修改后的自然数定义:

data NList = NNil

| NCons () NList -- 使用了递归定义

deriving (Show)

我们可以看到,NList 实际上就是类型为()的列表。我们用这个新的自然数定义重新实现上面两个转换函数,于是有:

nlToInt :: NList -> Int

nlToInt NNil = 0

--^ NNil

nlToInt (NCons () nl) = 1 + (nlToInt nl)

--^ () NCons NList

--- 在ghci中的运行结果如下

> nlToInt (NCons () (NCons () (NCons () NNil))

3

nlToCharAs :: NList -> [Char]

nlToCharAs NNil = []

--^ NNil

nlToCharAs (NCons () nl) = 'A' : (nlToCharAs nl)

--^ () NCons NList

--- 在ghci中的运行结果如下

> nlToCharAs (NCons () (NCons () (NCons () NNil))

"AAA"

在上面的两个新的转换函数中,NNil 和NCons、() ,以及递归的NList有了直接的一一对应。

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

相关小说

枕上书续写(东华凤九) 连载中
枕上书续写(东华凤九)
一堆乱码iosty
凤九:我白凤九无论如何都要把东华拉入十丈红尘东华:三生三世枕上书,这只小狐狸终究是我的
1.2万字8个月前
老师们也有叛逆期 连载中
老师们也有叛逆期
口袋里的薄荷糖
1.3万字8个月前
三生三世枕上书后续(自创) 连载中
三生三世枕上书后续(自创)
墨灞茇
自己看内容!爱追三生三世枕上书剧的人可以看一看,或者说如果觉得在《三生三世十里桃花》里面凤九被虐的很惨的人可以看一看。
1.9万字8个月前
血族精灵女王大人之契约者 连载中
血族精灵女王大人之契约者
爱吃西瓜的猫酱酱
不可一世的精灵女王为了一个毫不留情的一个人心里的伤一次又一次爱而不得,使自己遍体鳞伤最重要还是要爱自己呀自愈力比一般人强大又是女王要什么得不......
10.5万字8个月前
猫妖大人在我家 连载中
猫妖大人在我家
花子49
“轰隆隆……”潇涵望向窗外,稍微皱了一下眉头潇涵耀耀,一会儿早回家,别去打工了,这天好像要下雨苏耀耀听到声音,把头从手机屏幕上移开,望了望窗......
5.0万字8个月前
快穿被我钓进鱼塘的他们 连载中
快穿被我钓进鱼塘的他们
少年月球_BoyMoon
【已签约】一位失忆的少年,他叫谢薄衍,是懵懂的?却很聪明有情商,推测以前是个老司机。系统699是凭空蹦出来的?不是,它有出生有来历,它来自快......
2.3万字8个月前