Skip to content

Commit c7b1756

Browse files
authored
add logT (#33)
1 parent 8d63888 commit c7b1756

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

MonadTransformers/4.1/logT.hs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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

0 commit comments

Comments
 (0)