Monad为什么要排序Set1?

时间:2016-06-01 00:15:28

标签: functional-programming monads agda dependent-type

我一直在尝试编码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'实例'实际上只是传递的函数记录。问题:为什么Monad排序Set1使用Set对其进行批注会出现以下错误:

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

1 个答案:

答案 0 :(得分:2)

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

您对BSet{A : Set})进行了量化,因此{A B : Set}return的类型位于_⟫=_因此整个事情都在于Set1。使用显式Universe,代码如下所示:

Set1

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