我一直在尝试编码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
我应该通过哪些思考过程来确定Monad
是Set1
而不是Set
?
答案 0 :(得分:2)
Agda具有无限的Universe层次结构Set : Set1 : Set2 : ...
,以防止悖论(Russell's paradox,Hurkens' paradox)。 _->_
保留此层次结构:(Set -> Set) : Set1
,(Set1 -> Set) : Set2
,(Set -> Set2) : Set3
,即A -> B
所在的Universe取决于A
和{{}的Universe 1}}谎言:如果B
的大于A
,则B
与A -> B
位于同一个Universe中,否则A
位于与A -> B
相同的宇宙。
您对B
(Set
和{A : Set}
)进行了量化,因此{A B : Set}
和return
的类型位于_⟫=_
因此整个事情都在于Set1
。使用显式Universe,代码如下所示:
Set1
有关Agda wiki中的Universe多态性的更多信息。