Why is runXXX not part of the MonadTrans definition?

The document MonadTranssays:

Each monad transformer also comes with a runXXX operation to deploy the transformer, exposing the internal monad calculation.

Therefore, I wonder why MonadTransit is not defined as

class MonadTrans t where
  type p :: *
  type r :: * -> *
  lift:: Monad m => m a -> t m a
  run :: t m a -> p -> m (r a)

to eliminate the above item? Is this definition above not enough general? If so, which monad transformer is not suitable for this definition?

UPDATE

Adjusted a bit to include a different type of result.

+4
source share
2 answers

. , LogicT ContT FreeT .

, : . , , , . , lift MonadTrans :

lift (return x) = return x

lift (m >>= f) = lift m >>= \x -> lift (f x)

, lift , , :

(lift .) return = return                        -- fmap id = id

(lift .) (f >=> g) = (lift .) f >=> (lift .) g  -- fmap (f . g) = fmap f . fmap g

, (lift .) kleisli, lift , , .

, Functor, Monad MonadTrans, Typeclassopedia , .

+15

, .

, run MonadTrans. , :

class MonadTrans' t where
    type r m a :: *
    lift':: Monad m => m a -> t m a
    run :: Monad m => t m a => r m a

, , ...

, MonadTrans' :

instance MonadTrans t => MonadTrans' t where
   type r = t
   lift' = lift
   run = id

, runXXX ...

, run, , . , Haskell , (?) , ..

class C l t | l -> t where ac :: l -> t
0

Source: https://habr.com/ru/post/1548430/


All Articles