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

时间:2016-08-09 14:53:24

标签: dependent-type idris

总的伊德里斯新手问题,对不起。

我在学校接受过自然数(N)和自然数(零)(N0) 在Idris中,存在根据定义对应于N0的数据类型Nat。

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

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

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

必须有0个没有意义的情况,我想现在正确定义这些更复杂 或者不是?

1 个答案:

答案 0 :(得分:8)

我已经看到它定义了两种方式,但我们更喜欢在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