总的伊德里斯新手问题,对不起。
我在学校接受过自然数(N)和自然数(零)(N0) 在Idris中,存在根据定义对应于N0的数据类型Nat。
如果将Nat定义如下,会有什么变化:
data Nat = One | S Nat
data Nat0 = Zero | Nat
我想现在更容易,但主要是编译器实现问题还是正式问题?
必须有0个没有意义的情况,我想现在正确定义这些更复杂 或者不是?
答案 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 Int
或Tree 2 Int
或Tree 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