综观kind的Monad:
ghci>:k Monad
Monad :: (* -> *) -> Constraint
Run Code Online (Sandbox Code Playgroud)
我相信那是因为它需要一个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'
Run Code Online (Sandbox Code Playgroud)
所以,第一个(* -> *)来自我Monad的kind,我相信.但是* -> *呢?
第二个* -> *也来自于Monad那种!monad变换器接受一个类型参数,该类型参数是Monad(或至少是具有a类型的类型Monad)并且生成一个新类型Monad(它也具有a类Monad).
* -> * -- a Monad
(* -> *) -> * -> * -- Something that takes a Monad and makes a new Monad.
* -> * -- also a Monad
Run Code Online (Sandbox Code Playgroud)