Haskell 是否可以创建带有有理数的递归数据类型,如->;数据Nat=零|成功Nat?

Haskell 是否可以创建带有有理数的递归数据类型,如->;数据Nat=零|成功Nat?,haskell,recursion,Haskell,Recursion,可以为有理数创建递归数据吗? 我看到这个是自然数 data Nat = Zero | Succ Nat 我可能需要用两个数字来表示比率?但是像零,零这样的东西不起作用 谢谢 正有理数 我们可以这样定义它: data Nat0 = One | Succ0 Nat0 data Nat = Zero | Succ Nat data PosRational = PosRational Nat Nat0 因此,这里我们使用递归定义的两种数据类型Nat0(不包括zero)和Nat(包括zero),以及一

可以为有理数创建递归数据吗? 我看到这个是自然数

data Nat = Zero | Succ Nat
我可能需要用两个数字来表示比率?但是像零,零这样的东西不起作用

谢谢

正有理数 我们可以这样定义它:

data Nat0 = One | Succ0 Nat0
data Nat = Zero | Succ Nat
data PosRational = PosRational Nat Nat0
因此,这里我们使用递归定义的两种数据类型
Nat0
不包括zero)和
Nat
(包括zero),以及一种数据类型
PosRational
,它接受
Nat
Nat0
(分子和分母)

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

data Z = Pos Nat | Neg Nat0
然后将我们的
Rational
定义为:

data Rational = Rational Z Nat0
可数性ℚ 然而,我们实际上并不需要它(因为我们不需要快速访问分子和分母)有理数是可数的。我们可以通过以下方案列举所有这些方案:

因此,我们可以简单地将其定义为:

data Rational = Zero | NextRational Rational

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

你可以定义一个
数据Nat0=One | suc0 Nat0
,除了零以外的所有自然数。我不太愿意称这种类型为
有理数,因为它不包括负数,但值得权衡的是,不必首先根据自然数定义整数。@chepner:好的观点,我用一种可能的表示负有理数的方法对它进行了更新,当然我们也可以在
rational
级别进行更新。只是为了好玩:定义
Z
的更好方法是
data Z=Nat:-Nat
,以及一个商规则
实例Eq Z,其中(a:-b)=(c:-d)=(a+d)=(c+b)
。这显著地减少了定义通常算术运算所涉及的头痛,因为通常只有一个案例而不是四个要考虑的问题。