Functional programming 什么是累积宇宙和“*:*”?

Functional programming 什么是累积宇宙和“*:*”?,functional-programming,type-systems,agda,dependent-type,idris,Functional Programming,Type Systems,Agda,Dependent Type,Idris,在Agda中,有集合n。据我所知,Set n将Haskell风格的值类型种类层次结构扩展到无限级别。也就是说,Set 0是正常类型的宇宙,Set 1是正常类型的宇宙,Set 2是正常类型的宇宙,等等 相反,伊德里斯拥有所谓的“宇宙累积层次”。似乎对于a

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

相反,伊德里斯拥有所谓的“宇宙累积层次”。似乎对于
a
类型a:Type b
,以及宇宙水平都是推断出来的。但这在现实世界的节目中意味着什么呢?我们不能定义一些只作用于更高宇宙而不作用于更低宇宙的东西吗


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

在Agda中使用*:*将对应于设置n:Set n,此时您可能只需删除级别并设置:Set,您可以使用--type in type标志实现这一点

但是你不应该在集合0,集合1,集合2之间画平行线。。。类型,种类,种类,;因为haskell中的类具有这样的直觉,即它们仅在类型检查期间相关,而您可以拥有集1中具有类型的完全有效的运行时数据

累积性是指集合n是集合(n+1)的一个子类型,因此,如果在集合0中定义类型,也可以在需要集合1或集合2的地方使用它。在Agda的标准库中,模块级中有一个提升类型,可以实现类似的功能,但它的工作方式不太好。 将累积性添加到Agda中是有意义的

此外,Idris还具有“典型的模糊性”,其中宇宙级别对用户来说并不明显,但不知何故,typechecker应该检查您是否以不一致的方式使用宇宙

目前在Idris中实施的内容实际上不足以排除悖论:


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

在Idris中不推断宇宙:Idris构造一个图并检查它是否是非循环的。有了
*:*
你永远不需要写出级别(我对写
∀ {α₁ α₂ α₃ β₁ β₂ β₃ γ₁ γ₂ γ₃} {C₁ : α类₁ β₁ γ₁} {C₂ : α类₂ β₂ γ₂} {C₃ : α类₃ β₃ γ₃}而不是
∀ {C₁ C₂ C₃}),在Agda记录中,不能正确地包含宇宙多态函数,这是非常烦人的,
HList
必须作为函数而不是数据重写,由于
集ω
错误等原因,您不能合成一些函数。例如,
*:*
非常方便。Idris是如何构造图的?我已经看到了这个ki以前我有很多信息,但我不明白,因为我对数据结构和算法太差了。节点是层次,边是
(@user3237465为什么HList必须写为函数?@Saizan,我是说HList。