什么是累积宇宙和 `* : *`?

What are cumulative universes and `* : *`?

在 Agda 中,有 Set n。据我了解,Set n 将 Haskell 样式的值类型类型层次结构扩展到无限级别。也就是说,Set 0 是正常类型的宇宙,Set 1 是正常类型的宇宙,Set 2 是正常类型的宇宙,等等。

相比之下,伊德里斯有所谓的"cumulative hierarchy of universes"。似乎对于a < bType a: Type b、宇宙层次都是推断出来的。但这在现实世界的程序中意味着什么?我们不能定义一些只在更高而不是更低的宇宙上运行的东西吗?

顺便说一下,我知道逻辑上不一致,但是* : *和上面一致的解法相比是什么?

在 Agda 中有 * : * 对应于 Set n : Set n,此时你可能只是降低级别并只有 Set : Set,你可以通过 --type-in​​- 实现类型标志。

但是,您不应该真正将第 0 组、第 1 组、第 2 组……与类型、种类、种类相提并论;因为 haskell 中的种类具有直觉,即它们仅在类型检查期间相关,而您可以拥有完全有效的运行时数据,其类型在 Set 1 中。

累积性是指集合 n 是集合 (n+1) 的子类型,因此如果您在集合 0 中定义类型,您也可以在需要集合 1 或集合 2 的地方使用它。在Agda 的标准库在模块 Level 中有一个 Lift 类型来实现类似的功能,但效果不佳。 为 Agda 添加累积性是有意义的。

Idris 还具有 "typical ambiguity" Universe 级别对用户而言不明显,但类型检查器应该以某种方式检查您是否以不一致的方式使用 Universe。

目前在 Idris 中实现的内容实际上还不足以排除悖论: https://github.com/idris-lang/Idris-dev/issues/287

然而,Coq 也允许您在某些情况下省略宇宙级别,我相信他们没有已知的与此相关的不一致。