In Agda, there is Set n
. As I understand, Set n
extends the Haskell-style value-type-kind hierarchy to infinite levels. That is, Set 0
is the universe of normal types, Set 1
is the universe of normal kinds, Set 2
is the universe of normal sorts, etc.
In contrast, Idris has the so called "cumulative hierarchy of universes". It seems that for a < b
, Type a: Type b
, and universe levels are inferred. But what does it mean in real world programs? Can't we define something that only operate on some higher but not lower universe?
By the way, I know it's logically inconsistent, but what is * : *
compared to the above consistent solutions?
* : *
you never need to write out levels (I'm quite tired writing stuff like∀ {α₁ α₂ α₃ β₁ β₂ β₃ γ₁ γ₂ γ₃} {C₁ : Category α₁ β₁ γ₁} {C₂ : Category α₂ β₂ γ₂} {C₃ : Category α₃ β₃ γ₃}
instead of∀ {C₁ C₂ C₃}
), in Agda records can't contain properly universe polymorphic functions, which is very annoying,HList
must be rewritten as a function instead of a data, you can't compose some functions because of theSetω
error and so on. I.e.* : *
is very convenient. – user3237465(<)
. I.e. you can't havel1 < l2
andl2 < l1
, because this would result inl1 < l1
, which meansType l1 : Type l1
. – user3237465