这个像州一样的monad是个好名字

时间:2010-12-14 05:12:25

标签: haskell monads

这是StateWriter的组合。我检查过monad法律。

newtype M s a = M { runM :: s -> (s,a) }

instance (Monoid s) => Monad (M s) where
    return = M . const . (mempty,)
    m >>= f = M $ \s -> 
        let (s' ,x) = runM m s
            (s'',y) = runM (f x) (s `mappend` s')
        in (s' `mappend` s'', y)

StateWriter似乎有点蹩脚。

3 个答案:

答案 0 :(得分:3)

“内省作家”?看起来你可以用它做的有趣的事情(你不能用Writer做)就是编写一个内省函数来检查状态/输出并改变它:

introspect :: (s -> s) -> M s ()
introspect f = M $ \s -> (f s, ()) 

我无法看到你可以为作家做这件事,我认为你必须用后置变压器来代替:

postW :: Writer w a -> (w -> w) -> Writer w a
postW ma f = Writer $ let (w,a) = getWriter ma in (f w,a)

答案 1 :(得分:2)

Monoidal StateMonoStateMStateAccumState

答案 2 :(得分:0)

也许打电话给SW(Statefull Writer),我认为短名称是相当直观的,可以节省一些打字。