Ooops - more bugs in my explanation...

Brian Hulley wrote:
  -- from State.hs
   newtype State s a = S (s -> (a,s))

I used the source given in ghc-6.4.2\libraries\monads\Monad\State.hs but the version of state monad that comes with the hierarchical libs is in ghc-6.4.2\libraries\mtl\Control\Monad\State.hs - the bits related to the explanation behave in the same way but you might find it interesting to decide which implementation is more readable since mtl uses record syntax and the other version doesn't.

    q >>= (\x -> p)

means that both q and p are expressions that evaluate to monadic
values ie values whose type is of the form

   S (s -> (a, s))
So we have:

   q :: S (s -> (a, s))
   (\x -> p) :: a -> S (s -> (b, s))

Ooops! I meant:

     q :: State s a
     (\x -> p) :: a -> State s b

therefore the *value* of q is of the form S (s -> (a,s)) and the value of (\x -> p) is of the form (a -> S(s -> (b, s)))


To make the explanation simpler, we can rename the variables in the
definition of >>= to reflect their types:
                                           ^^^^^^^^
      "to reflect the structure of their values"

Apologies for the millions of corrections and re-posts for this explanation - no matter how hard I try to proof read my posts something always slips through... ;-)

Regards, Brian.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to