1+ {-# LANGUAGE  MultiParamTypeClasses, FunctionalDependencies ,FlexibleInstances #-}
12module  EitherT  where 
23
34import  Control.Monad 
4- import  Control.Monad.Trans 
55
66newtype  MyEitherT  l  m  r  =  MyEitherT  {  runMyEitherT  ::  m  (Either l  r )} 
77
8+ class  MonadTrans  t  where 
9+  lift  ::  Monad m  =>  m  a  ->  t  m  a 
10+ 11+ class  (Show e , Monad m ) =>  (MonadError  e  m ) where 
12+  eFail  ::  e  ->  m  a 
13+  eHandle  ::  m  a  ->  (e  ->  m  a ) ->  m  a 
14+ 815instance  (Monad m ) =>  Functor MyEitherT  l  m ) where 
916 fmap  =  liftM
1017
1118instance  (Monad m ) =>  Applicative MyEitherT  l  m ) where 
12-  pure  =  MyEitherT  .  pure  .  Right 
19+  pure  =  MyEitherT  .  pure  .  Right 
20+  (<*>)  =  ap
1321
1422instance  (Monad m ) =>  Monad MyEitherT  l  m ) where 
1523 return  =  pure 
@@ -23,3 +31,11 @@ instance MonadTrans (MyEitherT l) where
2331 lift m =  MyEitherT  $  do 
2432 m' <-  m
2533 return  $  Right 
34+ 35+ instance  (Show l , Monad m ) =>  MonadError  l  (MyEitherT  l  m ) where 
36+  eFail l =  MyEitherT  $  return  $  Left 
37+  eHandle m1 m2 =  MyEitherT  $  do 
38+  m1' <-  runMyEitherT m1
39+  case  m1' of 
40+  Right ->  return  m1'
41+  Left ->  runMyEitherT $  m2 err
0 commit comments