Week 2 Lecture 2
hs
1import Control.Monad (ap, liftM)2import Data.Traversable (fmapDefault, foldMapDefault)34-- Pretend this file is much larger and complicated...56data Tree a7 = Leaf a8 | Node (Tree a) (Tree a)9 deriving (Show)1011someTree :: Tree Int12someTree =13 Node (Leaf 2) (Node (Node (Leaf 1) (Leaf 0)) (Leaf 5))1415-- *16-- / \17-- 2 *18-- / \19-- * 520-- / \21-- 1 02223-- instance Foldable Tree where24-- foldMap :: (Monoid m) => (a -> m) -> Tree a -> m25-- foldMap f (Leaf a) = f a26-- foldMap f (Node lc rc) = mappend (foldMap f lc) (foldMap f rc)2728transformTree :: Int -> Tree Int -> Tree Bool29transformTree x (Leaf y) = Leaf (y >= x)30transformTree x (Node lc rc) = Node (transformTree x lc) (transformTree x rc)3132newtype Reader r a = Reader (r -> a)3334instance Functor (Reader r) where35 fmap f (Reader r) = Reader (f . r)3637instance Applicative (Reader r) where38 pure = Reader . const39 (Reader r1) <*> (Reader r2) = Reader $ \r -> let a = r2 r in r1 r a4041instance Monad (Reader r) where42 (Reader ra) >>= arb = Reader $ \r ->43 let a = ra r44 in case arb a of45 (Reader rb) -> rb r4647ask :: Reader r r48ask = Reader id4950runReader :: Reader r a -> r -> a51runReader (Reader f) r = f r5253-- transformTreeM :: Tree Int -> Reader Int (Tree Bool)54-- transformTreeM (Leaf v) = (Leaf . (v >=)) <$> ask55-- transformTreeM (Node lhs rhs) = Node <$> transformTreeM lhs <*> transformTreeM rhs56transformTreeM :: Tree Int -> Reader Int (Tree Bool)57transformTreeM (Leaf v) = do58 t <- ask59 pure $ Leaf $ v >= t60transformTreeM (Node lhs rhs) = do61 lhs' <- transformTreeM lhs62 rhs' <- transformTreeM rhs63 pure $ Node lhs' rhs'6465-- newtype Writer w a = Writer (w, a)66--67-- instance Functor (Writer w) where68-- fmap f (Writer (w, a)) = Writer (w, f a)69--70-- instance (Monoid w) => Applicative (Writer w) where71-- pure :: (Monoid w) => a -> Writer w a72-- pure a = Writer (mempty, a)73-- (<*>) :: (Monoid w) => Writer w (a -> b) -> Writer w a -> Writer w b74-- (<*>) (Writer (w1, f)) (Writer (w2, a)) = Writer (mappend w1 w2, f a)75--76-- instance (Monoid w) => Monad (Writer w) where77-- (>>=) :: Writer w a -> (a -> Writer w b) -> Writer w b78-- (>>=) (Writer (w1, a)) f =79-- let (Writer (w2, b)) = f a80-- in (Writer (mappend w1 w2, b))81--82-- tell :: w -> Writer w ()83-- tell x = Writer (x, ())84--85-- tellOne :: w -> Writer [w] ()86-- tellOne x = Writer ([x], ())87--88-- runWriter :: Writer w a -> (w, a)89-- runWriter (Writer x) = x9091-- liftM -- Defines fmap by only using Monad's implementation92fmapMonad :: (Monad m) => (a -> b) -> m a -> m b93fmapMonad f a = a >>= \a' -> pure (f a')9495-- ap -- Defined (<*>) by only using Monad's implementation96applyMonad :: (Monad m) => m (a -> b) -> m a -> m b97applyMonad f x = f >>= \f' -> x >>= \a' -> pure (f' a')9899newtype State s a = State (s -> (s, a))100101instance Functor (State s) where102 -- fmap f (State g) = State $ \x -> let (s, a) = g x in (s, f a)103 fmap = liftM104105instance Applicative (State s) where106 pure :: a -> State s a107 pure a = State $ \s -> (s, a)108109 -- (<*>) :: State s (a -> b) -> State s a -> State s b110 -- (<*>) (State f) (State g) = State $ \y ->111 -- let112 -- (s1, f1) = f y113 -- (s2, a) = g s1114 -- in (s2, f1 a)115 (<*>) = ap116117instance Monad (State s) where118 (State sa) >>= asb = State $ \s ->119 let (s', a) = sa s120 State sb = asb a121 in sb s'122123put :: s -> State s ()124put s = State $ const (s, ())125126get :: State s s127get = State (\s -> (s, s))128129frobTreeM :: Tree Int -> State Int (Tree Int)130frobTreeM (Leaf x) = do131 s <- get132 put (s + 1)133 pure (Leaf (x + s))134frobTreeM (Node lhs rhs) = do135 lhs' <- frobTreeM lhs136 rhs' <- frobTreeM rhs137 pure (Node lhs' rhs')138139runState :: State s a -> s -> (s, a)140runState (State x) = x141142instance Functor Tree where143 fmap = fmapDefault144145instance Foldable Tree where146 foldMap = foldMapDefault147148instance Traversable Tree where149 traverse :: (Applicative f) => (a -> f b) -> Tree a -> f (Tree b)150 traverse f (Leaf a) = let fb = f a in Leaf <$> fb151 -- traverse f (Node lc rc) = Node <$> (traverse f lc) <*> (traverse f rc)152 -- traverse f (Node lc rc) = liftA2 Node (traverse f lc) (traverse f rc)153 traverse f (Node lc rc) = pure Node <*> (traverse f lc) <*> (traverse f rc)154155-- let lb = traverse f lc156-- rb = traverse f rc157-- in Node <$> lb <*> rb158159-- Traversable160161-- Spaaaaace :pea_pod: . :coconut: = :peanuts: