试图理解索引类型
Trying to understand indexed types
我正在尝试了解 FStar 教程中的矢量类型:
type vector (a: Type) : nat -> Type =
| Nil : vector a 0
| Cons : hd: a -> n: nat -> tl: vector a n -> vector a (n + 1)
Cons nat 3 Nil
构造向量 - 类似于构造普通列表 - 失败,而 Cons nat 3
被接受。有人可以通过阅读 Cons
需要尾参数来向我解释我哪里错了吗?此外,如何创建具有实际元素的向量 - 或者它是 "empty vector" 类型吗?
这里有点混乱,抱歉:)
vector
的类型参数 a
对于 Nil
和 Cons
是隐含的(出于我也不清楚的原因)。因此,当您编写 Cons nat
时,nat
参数实际上是 hd
参数,并且 F* 将 a
推断为 Type0
(nat
的类型).所以你正在构建一个类型向量,这可能不是你想要的。
Cons nat 3 Nil
失败的原因是因为 3
参数错误并且与 Nil
列表的长度不对应。 Cons nat 0 Nil
有效,是包含单一类型 nat
.
的大小为 1 的向量
Cons nat 3
工作的原因是因为你还没有给它 tl
参数,所以这是一个部分应用的构造函数,Cons
应用于其 3 个参数中的 2 个。 Cons nat 3
的类型是 vector Type0 3 -> vector Type0 4
,因此需要大小为 3 的向量以生成类型 4 的向量的函数。
希望这对您有所帮助。
我正在尝试了解 FStar 教程中的矢量类型:
type vector (a: Type) : nat -> Type =
| Nil : vector a 0
| Cons : hd: a -> n: nat -> tl: vector a n -> vector a (n + 1)
Cons nat 3 Nil
构造向量 - 类似于构造普通列表 - 失败,而 Cons nat 3
被接受。有人可以通过阅读 Cons
需要尾参数来向我解释我哪里错了吗?此外,如何创建具有实际元素的向量 - 或者它是 "empty vector" 类型吗?
这里有点混乱,抱歉:)
vector
的类型参数a
对于Nil
和Cons
是隐含的(出于我也不清楚的原因)。因此,当您编写Cons nat
时,nat
参数实际上是hd
参数,并且 F* 将a
推断为Type0
(nat
的类型).所以你正在构建一个类型向量,这可能不是你想要的。Cons nat 3 Nil
失败的原因是因为3
参数错误并且与Nil
列表的长度不对应。Cons nat 0 Nil
有效,是包含单一类型nat
. 的大小为 1 的向量
Cons nat 3
工作的原因是因为你还没有给它tl
参数,所以这是一个部分应用的构造函数,Cons
应用于其 3 个参数中的 2 个。Cons nat 3
的类型是vector Type0 3 -> vector Type0 4
,因此需要大小为 3 的向量以生成类型 4 的向量的函数。
希望这对您有所帮助。