Вот отличное (и лично мое любимое) объяснение Государственной монады: Learn You A Haskell .(Также отличный ресурс для изучения Haskell в целом).
Возможно, вы заметили, что функции не являются частью класса типов Show
в Haskell.А поскольку State
является просто оболочкой newtype
для функций определенных типов, вы не можете создать (осмысленный) State
экземпляр Show
.
Вот код, использующийState Monad от LYAH:
import Control.Monad.State -- first, import the state monad
pop :: State Stack Int
pop = State $ \(x:xs) -> (x,xs)
push :: Int -> State Stack ()
push a = State $ \xs -> ((),a:xs)
stackManip :: State Stack Int
stackManip = do
push 3
a <- pop
pop
И вот этот код в действии от ghci
:
*Main> runState stackManip [1,2,3]
(1,[2,3])
Результат fst
кортежа, а snd
кортежа является (измененным) состоянием.