在Haskell中,Monads由kleisli triple定义.
在一般的分类理论中,可以这样说:
Monads = Functors + monadic 类型的幂等性(不是值)?
不,monad强调不是幂等的:虽然要求有一个自然的转变
mu_x : T(T(x)) -> T(x)
Run Code Online (Sandbox Code Playgroud)
它是在一般不的情况下,以这种方式选择的两个对象是相等的,即,
T(T(x)) = T(x)
Run Code Online (Sandbox Code Playgroud)
通常不会持有,甚至达到同构.
即使在Haskell的受限制的土地上,Monad也很容易看到这一点:Maybe (Maybe ())并且Maybe ()显然是不等的类型,具有不同数量的语义对象; 忽略底部:
Nothing, Just () -- Maybe ()
Nothing, Just Nothing, Just (Just ()) -- Maybe (Maybe ())
Run Code Online (Sandbox Code Playgroud)
或底部:
_|_, Nothing, Just _|_, Just () -- Maybe ()
_|_, Nothing, Just _|_, Just Nothing, Just (Just _|_), Just (Just ()) -- Maybe (Maybe ())
Run Code Online (Sandbox Code Playgroud)