这有点像是 State
和 Writer
的结合体。我已经检查了单子法则。
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
看起来有点弱。
conat
?我本来期望是return a = M.flip (,) a
或者类似的东西。 - ephemient>>=
没有产生(s \
mappend` s' `mappend` s'', y)`?我对返回的幺半群有点困惑。 - rampions mappend s' mappend s''
会意味着当f = return() >> return() >> return()时,runThing f "hello"将返回类似于("hellohellohello", ())的内容,对吗? - Axman6runM f "hello" where f = return () >> return () >> return ()
目前是("", ())
,这对我来说也有点困惑。 - rampion