Writer
newtype Writer w a = Writer { runWriter :: (a, w) }
instance (Monoid w) => Monad (Writer w) where
? ? return x = Writer (x, mempty)
? ? (Writer (x,v)) >>= f = let (Writer (y, v')) = f x
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? in Writer (y, v `mappend` v')
write1 >>= func = do?
? ? let (val1, logs1) = runWriter writer1
? ? ? ? ?(val2, logs2) = runWriter$func val1
? ? writer(val2, logs1 ++ logs2)
例子
importControl.Monad.Writer
logNumber::Int->Writer[String]Int
logNumber?x=Writer(x,?["Got?number:?"++show?x])
multWithLog::Writer[String]Int
multWithLog=do
? ? a<-logNumber3
? ? b<-logNumber5
? ? return?(a*b)
Reader
data Reader r a = Reader { runReader :: r -> a}
the function monad is also called read monad
instanceMonad((->) r)where
return?x=\_->x
h>>=f=\w->f?(h?w)?w
example:
importControl.Monad.Instances
addStuff :: Int->Int
addStuff = do
? ? a<-(*2)
? ? b<-(+10)
? ? return?(a+b)
ghci>addStuff 3
19
其實read monad也很好理解迹卢,它的context就是傳入?yún)?shù)
The State Monad
State s a = State { runState :: s -> (a, s) }
instance Monad (State s) where?
? ? return x = State $ \s -> (x, s)
? ? (State h) >> f = State $ \s -> let (a, newState) = h s?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?(State g) = f a
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?in g newState
m >>= k = State $ \s -> let (a, s') = runState m s
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? in runState (k a) s'