为什么 Monad 是 Set1?

Why is Monad of sort Set1?

我一直在尝试在 Agda 中对 Monad 类型类进行编码。我已经走到这一步了:

module Monad where
  record Monad (M : Set → Set) : Set1 where
    field
      return : {A : Set} → A → M A
      _⟫=_ : {A B : Set} → M A → (A → M B) → M B

所以 Monad 'instance' 实际上只是传递的函数的记录。问题:为什么 Monad 排序为 Set1Set 注释会出现以下错误:

The type of the constructor does not fit in the sort of the
datatype, since Set₁ is not less or equal than Set
when checking the definition of Monad

我应该经过什么样的思考过程才能确定 MonadSet1 而不是 Set

Agda 有一个无限层次的宇宙 Set : Set1 : Set2 : ... 来防止悖论 (Russell's paradox, Hurkens' paradox)。 _->_ 保留此层次结构:(Set -> Set) : Set1(Set1 -> Set) : Set2(Set -> Set2) : Set3,即 A -> B 所在的宇宙取决于 AB谎言:如果A的大于B的,则A -> BA位于同一个宇宙,否则A -> B位于与 B.

相同的宇宙

您正在量化 Set(在 {A : Set}{A B : Set} 中),因此 return_⟫=_ 的类型在 Set1,因此整个事情都在于 Set1。对于显式宇宙,代码如下所示:

TReturn : (Set → Set) → Set1
TReturn M = {A : Set} → A → M A

TBind : (Set → Set) → Set1
TBind M = {A B : Set} → M A → (A → M B) → M B

module Monad where
  record Monad (M : Set → Set) : Set1 where
    field
      return : TReturn M
      _⟫=_ : TBind M

Agda wiki 中有关 Universe 多态性的更多信息。