haskell - 是否可以使用有理数创建递归数据类型,例如 -> data Nat = Zero |苏克纳特?

标签 haskell recursion

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

data Nat = Zero | Succ Nat

我可能需要使用两个数字来表示比率?但是像“零,零”这样的东西不起作用。

谢谢!

最佳答案

正有理数

我们可以这样定义它:

data Nat0 = One | Succ0 Nat0
data Nat = Zero | Succ Nat
data PosRational = PosRational Nat Nat0

所以这里我们使用递归定义的两种数据类型Nat0(排除零)和Nat(包括零),以及一个数据类型 PosRational,采用 NatNat0(因此是分子和分母)。

包括负有理数

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

data Z = Pos Nat | Neg Nat0

然后将我们的Rational定义为:

data Rational = Rational Z Nat0

ℚ的可数性

尽管如此,我们实际上并不需要它(假设我们不需要快速访问分子和分母)。 有理数是可数的。我们可以使用以下方案枚举所有这些 [source] :

countability of rational numbers

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

data Rational = Zero | NextRational Rational

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

关于haskell - 是否可以使用有理数创建递归数据类型,例如 -> data Nat = Zero |苏克纳特?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459487/

相关文章:

c - 递归哈希代码?

recursion - 递归检查列表中的原子

haskell - StateT 超过 Cont。为什么我的状态没有被重置?

haskell - 如何理解 `MonadUnliftIO`对 "no stateful monads"的要求?

haskell - 实例声明 Haskell

haskell - 当累加器满足特定条件时,如何从haskell中的折叠函数中突破?

mysql层次结构自连接,检索所有子类别

Haskell 中类似 Jquery 的选择器

python - 这个 Python Lambda 递归表达式是如何工作的?

java - 递归需要不必要的返回并重新启动应用程序