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

时间:2015-11-13 05:19:30

标签: functional-programming type-systems agda dependent-type idris

在Agda中,有Set n。据我所知,Set n将Haskell风格的值类型类层次结构扩展到无限级别。也就是说,Set 0是普通类型的宇宙,Set 1是普通类型的宇宙,Set 2是正常类型的宇宙,等等。

相比之下,伊德里斯拥有所谓的累积宇宙层次&#34;。似乎对a < bType a: Type b和Universe级别进行了推断。但它在现实世界的节目中意味着什么?我们不能定义只能在更高但不低的宇宙上运行的东西吗?

顺便说一句,我知道它在逻辑上是不一致的,但与上述一致的解决方案相比,* : *是什么?

1 个答案:

答案 0 :(得分:7)

在Agda中使用*:*将对应于Set n:Set n,此时您可能只是删除了级​​别并且只有Set:Set,您可以使用--type-in​​-来实现这一点类型标志。

但是你不应该真正画出Set 0,Set 1,Set 2 ...和类型,种类,排序之间的平行线;因为haskell中的种类带有直觉,即它们只是在类型检查期间才有用,而你可以拥有完全有效的运行时数据,其类型为Set 1。

累积性是指Set n是Set(n + 1)的子类型,因此如果您在Set 0中定义类型,您也可以在需要Set 1或Set 2的地方使用它。在Agda&#中39; s标准库在模块Level中有一个Lift类型来实现类似的东西,但它不能很好地工作。 将积累性添加到Agda是有意义的。

Idris此外还有典型的歧义&#34;宇宙级别对于用户来说并不明显,但不知何故,类型检查器应该检查您是否以不一致的方式使用Universe。

目前在伊德里斯实施的内容实际上不足以排除悖论: https://github.com/idris-lang/Idris-dev/issues/287

但是,Coq也允许你在某些情况下省略宇宙级别,我相信它们没有与之相关的已知不一致。