File tree Expand file tree Collapse file tree 1 file changed +49
-0
lines changed
Expand file tree Collapse file tree 1 file changed +49
-0
lines changed Original file line number Diff line number Diff line change 1+ module LogT where
2+
3+ import Control.Applicative (liftA2 )
4+ import Control.Monad.Identity
5+
6+
7+ data Logged a = Logged String a deriving (Eq , Show )
8+
9+
10+ newtype LoggT m a = LoggT { runLoggT :: m (Logged a ) }
11+
12+
13+ instance Functor m => Functor (LoggT m ) where
14+ -- fmap :: (a -> b) -> f a -> f b
15+ fmap f m = LoggT $ fmap (\ (Logged s a) -> Logged s (f a)) (runLoggT m)
16+
17+
18+ instance Applicative m => Applicative (LoggT m ) where
19+ -- pure :: a -> m a
20+ pure = LoggT . pure . Logged " "
21+
22+ -- <*> :: m (a -> b) -> m a -> m b
23+ mf <*> ma = LoggT $ liftA2 f (runLoggT mf) (runLoggT ma) where
24+ f (Logged s g) (Logged s' a) = Logged (s ++ s') (g a)
25+
26+
27+ instance Monad m => Monad (LoggT m ) where
28+ -- >>= :: m a -> (a -> m b) -> m b
29+ ma >>= k = LoggT $ do
30+ (Logged s a) <- runLoggT ma
31+ (Logged s' b) <- runLoggT (k a)
32+ return $ Logged (s ++ s') b
33+
34+ -- fail :: String -> m a
35+ fail = LoggT . fail
36+
37+
38+ logTst :: LoggT Identity Integer
39+ logTst = do
40+ x <- LoggT $ Identity $ Logged " AAA" 30
41+ y <- return 10
42+ z <- LoggT $ Identity $ Logged " BBB" 2
43+ return $ x + y + z
44+
45+ failTst :: [Integer ] -> LoggT [] Integer
46+ failTst xs = do
47+ 5 <- LoggT $ fmap (Logged " " ) xs
48+ LoggT [Logged " A" () ]
49+ return 42
You can’t perform that action at this time.
0 commit comments