是否可以创建具有有理数的递归数据类型,例如 - > data Nat = Zero | Succ Nat?

Aut*_*zei 2 recursion haskell

是否有可能为有理数创建递归数据?我看到这个是自然数字

data Nat = Zero | Succ Nat
Run Code Online (Sandbox Code Playgroud)

我可能需要使用两个数字作为比率?但Zero,Zero之类的东西不起作用.

谢谢!

Wil*_*sem 7

积极的理性数字

我们可以定义它:

data Nat0 = One | Succ0 Nat0
data Nat = Zero | Succ Nat
data PosRational = PosRational Nat Nat0
Run Code Online (Sandbox Code Playgroud)

所以这里我们使用递归定义的两种数据类型Nat0(不包括零)和Nat(包括零),以及PosRational采用a NatNat0(所以分子和分母)的数据类型.

包括负有理数

我们还可以包括负有理数,例如通过定义:

data Z = Pos Nat | Neg Nat0
Run Code Online (Sandbox Code Playgroud)

然后将我们定义Rational为:

data Rational = Rational Z Nat0
Run Code Online (Sandbox Code Playgroud)

Count的可数性

然而,我们实际上并不需要(因为我们不需要快速访问分子和分母).理性数字是可数的.我们可以使用以下方案枚举所有这些[来源]:

有理数的可数性

所以我们可以简单地将其定义为:

data Rational = Zero | NextRational Rational
Run Code Online (Sandbox Code Playgroud)

基本上,每个可数集都可以使用这个定义,所以ℕ,ℤ,ℙ,ℚ等.

  • 只是为了好玩:定义`Z`的**更好的方法是`数据Z = Nat: - Nat`,以及引用规则`实例Eq Z其中(a: - b)==(c: - d) =(a + d)==(c + b)`.这显着减少了定义通常的算术运算所涉及的麻烦,因为通常只有一种情况而不是四种情况需要考虑. (4认同)