这是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)
StateWriter
似乎有点蹩脚。
答案 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 State
。 MonoState
。MState
。 AccumState
。
答案 2 :(得分:0)
也许打电话给SW
(Statefull Writer),我认为短名称是相当直观的,可以节省一些打字。