理解MonadTrans的"亲切"

Kev*_*ith 3 haskell

综观kindMonad:

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)

所以,第一个(* -> *)来自我Monadkind,我相信.但是* -> *呢?

Cir*_*dec 7

第二个* -> *也来自于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)