这是相结合的东西State
和Writer
.我检查过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)
Run Code Online (Sandbox Code Playgroud)
StateWriter
看起来有点蹩脚.
也许可以调用SW
(Statefull Writer),我认为短名称相当直观,并且可以节省一些打字时间。