美文网首页
Three useful monads

Three useful monads

作者: tigerhy1 | 来源:发表于2018-06-28 14:57 被阅读0次

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就是传入参数

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'

相关文章

网友评论

      本文标题:Three useful monads

      本文链接:https://www.haomeiwen.com/subject/cftqcttx.html