试图理解索引类型

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" 类型吗?

这里有点混乱,抱歉:)

  1. vector 的类型参数 a 对于 NilCons 是隐含的(出于我也不清楚的原因)。因此,当您编写 Cons nat 时,nat 参数实际上是 hd 参数,并且 F* 将 a 推断为 Type0nat 的类型).所以你正在构建一个类型向量,这可能不是你想要的。

  2. Cons nat 3 Nil 失败的原因是因为 3 参数错误并且与 Nil 列表的长度不对应。 Cons nat 0 Nil 有效,是包含单一类型 nat.

  3. 的大小为 1 的向量
  4. Cons nat 3 工作的原因是因为你还没有给它 tl 参数,所以这是一个部分应用的构造函数,Cons 应用于其 3 个参数中的 2 个。 Cons nat 3 的类型是 vector Type0 3 -> vector Type0 4,因此需要大小为 3 的向量以生成类型 4 的向量的函数。

希望这对您有所帮助。