为什么Idris中的Nat数据类型以0而不是1开头?

拉斯蒂斯拉夫·卡萨克(Rastislav Kassak)

共有Idris新手问题,对不起。

我在学校曾教过自然数(N)和零自然数(N0)。
在Idris中,存在数据类型Nat,其定义与N0相对应。

如果将Nat定义如下,将会发生什么变化:

data Nat = One | S Nat
data Nat0 = Zero | Nat

我想现在比较容易,但是主要是编译器实现问题还是正式的问题?

在某些情况下,0毫无意义,我想现在更难于正确定义。
或不?

埃德温·布雷迪

我已经看到它定义了两种方式,但是在Idris中我们更喜欢从零开始的一个原因是,它对于描述其他结构(例如列表或树)的大小很有用。列表中可以包含零个东西,树的高度可以为零,将两个零长度列表附加到一个零长度列表中。

使用您的定义会很好,只是在使用Nat谈论其他结构的属性时不必要地摆弄。

在零意义不大的情况下,您可以定义数据类型以使不可能将零作为索引。这是一个(人为的,未经测试的)示例,其中零是没有意义的,树按元素数量索引,而元素存储在叶子上:

data Tree : Nat -> Type -> Type where
     Leaf : ty -> Tree 1 ty
     Node : Tree n ty -> Tree m ty -> Tree (n + m) ty

鉴于这些构造,你永远无法作出,说,一Tree 0 Int但你能够使一个Tree 1 IntTree 2 IntTree n Int任何n > 0罚款...

test1 : Tree 1 Int
test1 = Leaf 94

test2 : Tree 2 Int
test2 = Node test1 test1

test3 : Tree 3 Int
test3 = Node test1 test2

test0 : Tree 0 Int
test0 = ?no_chance

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能够在Java中的长数据类型屏蔽32位

为什么SQL UNION可以合并MySQL中具有不同数据类型的两列?

为什么java.util.ArrayList中不允许使用原始数据类型?

在Java中,为什么String是非原始数据类型?

为什么在多个标准头文件中声明特定的C数据类型?

为什么只有字符串是不可变的而不是其他数据类型

为什么只有char *是<Bad Ptr>,而不是其他数据类型?

为什么将数据类型添加为类型声明的约束会导致匹配错误而不是更正确的错误?

为什么我的熊猫df是所有对象数据类型,而不是例如int,string等?

为什么数据表中INT0的向量数是1而不是2?

为什么我们应该为字符串数据类型而不是其余的数据导入#include <string>?

试图了解Scala中的Range集合以及为什么在Scala v2.13(而不是v2.11)中分配数据类型时会出现错误

为什么在应用了身份函数之后,列“ <I <dbl >>”而不是`<dbl>`的数据类型?

为什么Hadoop中的“自定义数据类型”发生溢出故障

对于Java中的这种情况,为什么原始数据类型比参考数据类型消耗更多的内存?

为什么PostgreSQL中的聚合函数不适用于布尔数据类型

为什么undefined是数据类型

为什么使用“ int”数据类型而不是“ float”数据类型?

为什么C ++中不同数据类型的大小不同

在Scala中,为什么不能用不同的数据类型更改var变量的值

为什么 enum 数据类型总是在 c 中的 main() 之外声明?

为什么守卫需要 Idris 中的 Ord 类型类?

为什么 SQL Server 不保留表达式中的数据类型?

为什么有人会使用 int 而不是 bool 数据类型?

为什么 00000000 - 00000001 = 11111111 在 C unsigned char 数据类型中?

为什么 Numpy 的 int 数据类型与 Numpy 的 int64 数据类型的类型不同?

为什么数据类型会冲突?

为什么我的公式在转换数据类型时返回 0 或 100?

为什么 (0 && 1 ==0) 不是真的?