查看kind
的{{1}}:
Monad
我认为这是因为它需要ghci>:k Monad
Monad :: (* -> *) -> Constraint
a
,并返回m a
约束。
查看Monad
的* MonadTrans
,我看到了:
kind
所以,我相信,第一个ghci>:i MonadTrans
class MonadTrans (t :: (* -> *) -> * -> *) where
lift :: Monad m => m a -> t m a
-- Defined in `Control.Monad.Trans.Class'
instance MonadTrans MaybeT
-- Defined in `Control.Monad.Trans.Maybe'
来自(* -> *)
的{{1}}。但是Monad
?
答案 0 :(得分:7)
第二个* -> *
也来自Monad
类! monad变换器采用类型参数Monad
(或至少是具有Monad
类型的类型)并生成一个新类型Monad
(也有Monad
)的种类。
* -> * -- a Monad
(* -> *) -> * -> * -- Something that takes a Monad and makes a new Monad.
* -> * -- also a Monad