以下是《Learn You a Haskell》第 13 章中状态单子的定义
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
根据此定义,在我看来,虽然返回的是较新的版本,但tuple 中的状态f a
似乎将被 替换。以Real World Haskell第 10 章中的具体示例为例,这显然不是作者的本意(请注意使用而不是 ,因为他们尚未正式引入 monad)newState
==>
>>=
parseByte :: Parse Word8
parseByte =
getState ==> \initState ->
case L.uncons (string initState) of
Nothing ->
bail "no more input"
Just (byte,remainder) ->
putState newState ==> \_ ->
identity byte
where newState = initState { string = remainder,
offset = newOffset }
newOffset = offset initState + 1
在哪里
newtype Parse a = Parse {
runParse :: ParseState -> Either String (a, ParseState)
}
identity :: a -> Parse a
identity a = Parse (\s -> Right (a, s))
(==>) :: Parse a -> (a -> Parse b) -> Parse b
firstParser ==> secondParser = Parse chainedParser
where chainedParser initState =
case runParse firstParser initState of
Left errMessage ->
Left errMessage
Right (firstResult, newState) ->
runParse (secondParser firstResult) newState
在parseByte
,我不明白如何initState
不取代newState
。