Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
-- This file:
--   http://angg.twu.net/HASKELL/State1.hs.html
--   http://angg.twu.net/HASKELL/State1.hs
--           (find-angg "HASKELL/State1.hs")
-- Author: Eduardo Ochs <eduardoochs@gmail.com>
--
-- (defun st () (interactive) (find-angg "HASKELL/State1.hs"))
-- (find-books "__comp/__comp.el" "haskell-hutton" "The state monad")
-- (find-huttonbookpage 198           "The state monad")
-- (find-huttonbooktext 198           "The state monad")

import Prelude hiding (fst, snd)

type State = Int

newtype ST a = S (State -> (a,State))

app :: ST a -> State -> (a,State)
app (S st) x = st x

instance Functor ST where
  -- fmap :: (a -> b) -> ST a -> ST b
  fmap g st = S (\s -> let (x,s') = app st s in (g x, s'))

instance Applicative ST where
  -- pure :: a -> St a
  pure x = S (\s -> (x,s))
  -- <*> :: ST (a -> b) -> ST a -> ST b
  stf <*> stx = S (\s ->
    let (f,s') = app stf s
        (x,s'') = app stx s' in (f x, s''))

instance Monad ST where
  -- (>>=) :: ST a -> (a -> ST b) -> ST b
  st >>= f = S (\s -> let (x,s') = app st s in app (f x) s')

fst :: (a,b) -> a
fst (va,vb) = va

snd :: (a,b) -> b
snd (va,vb) = vb

{-
* (eepitch-ghci)
* (eepitch-kill)
* (eepitch-ghci)
:load State1.hs
:t fst
:t Main.fst

-}


{-
-- (find-huttonbookpage 200 "fmap g st =")
-- (find-huttonbooktext 200 "fmap g st =")


fmap   g      st   = S (\   s    -> let (x  ,   s'  ) = app   st      s    in (g  x ,    s'  ))
     ====== ======       =======         === =======        ====== =======       ===  =======
     ::a->b ::ST a       ::State         ::a ::State        ::ST a ::State       ::a  ::State
==================                      =============   ==================     =====
     ::ST b                              ::(a,State)        ::(a,State)         ::b
                                                                              ================
                                                                                 ::(b,State)
                                    ==========================================================
                                                            ::(b,State)
                        ======================================================================
                                                         ::State->(b,State)
                     ==========================================================================
                                                        ::ST b



                 __________________________________
                |                                  |
                |          fmap g st               |
                |           ::ST b                 |
                |                                  |                  x = fst (app st s)
                |    ________          ________    |                 s' = snd (app st s)
                |   |        |   x    |        |   |   g x
                |   |   st   |  ::a   |    g   |   |   ::b
                |   | ::ST a |------->| ::a->b |--------------->
                |   |        |        |        |   |
                |   |        |        |________|   |
                |   |        |                     |
                |   |        |                     |
    --------------->|        |--------------------------------->
         s      |   |        |                     |     s'
      ::State   |   |        |                     |  ::State
                |   |________|                     |
                |                                  |
                |__________________________________|

-}




-- Local Variables:
-- coding:  utf-8-unix
-- indent-tabs-mode: nil
-- End: