Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 定义自己的抽象整数数据类型_Haskell_Data Structures - Fatal编程技术网

Haskell 定义自己的抽象整数数据类型

Haskell 定义自己的抽象整数数据类型,haskell,data-structures,Haskell,Data Structures,我有一个任务,在理解上有一些问题。任务是定义: 类型有三个构造函数:零(常量)、succabstractinteger(抽象的继承者)和Pred AbstractInteger(先前抽象者)。 谁能给我举个定义的例子吗?我真的不明白它是否必须包含值,或者它应该是怎样的 data AbstractInteger = Zero | Succ (AbstractInteger) | Pred (AbstractInteger) deriving(Sho

我有一个任务,在理解上有一些问题。任务是定义: 类型有三个构造函数:零(常量)、succabstractinteger(抽象的继承者)和Pred AbstractInteger(先前抽象者)。 谁能给我举个定义的例子吗?我真的不明白它是否必须包含值,或者它应该是怎样的

data AbstractInteger = Zero | Succ (AbstractInteger) | Pred (AbstractInteger)
                         deriving(Show, Eq)

像这样的东西?

我觉得不错。您不需要在数据声明中的
AbstractInteger
周围包含括号。首先是'data AbstractInteger a=Zero | such(AbstractInteger a)| Pred(AbstractInteger a)'所以我应该有:)但我还必须使它成为Ord和Num的实例,这样它就没有值了吗?我可以告诉你,我个人会编写函数
from Integer
to Integer
,在你的数据类型和标准Haskell
Integer
类型之间转换,然后将
Ord
Num
实例用于
Integer
。但是你的教授可能会考虑作弊。考虑一下如何递归地定义这些操作,不需要存储任何多态数据。整数不是容器。-我更喜欢
data AbstractInteger=Zero |负AbstractNat |正AbstractNat
data AbstractNat=One | suc AbstractNat
,因为它具有较少的冗余;但是你的版本也可以。如果你不接受@leftaroundabout的建议,你可能会想为
Eq
定义你自己的实例。正如@Tarmil所指出的,
toInteger(Succ(Succ零))==3
toInteger(Pred(Succ(Succ零))==3
,但是
Succ(Succ零))/=Pred(Succ(Succ零))
Eq的派生实例。