[Haskell-cafe] Gentle introduction questions / comments

Ryan Ingram ryani.spam at gmail.com
Tue Jan 27 13:47:10 EST 2009


2009/1/27 Matthijs Kooijman <matthijs at stdin.nl>:
> Hi all,
>
> I've been reading the gentle introduction to Haskell a bit more closely today
> and there a few things which I can't quite understand (presumably because they
> are typo's). I've found two issues with the "Using monads" section [1]. Not
> sure if this is the right place to report this, but there's probably somewhere
> here who can fix it :-)
>
> The first one is in the state monad data type. It reads:
>
>        data SM a = SM (S -> (a,S))  -- The monadic type
>
> I  can't seem to find out what "S" is exactly here. It seems to be a
> universally quantified type variable, but then it should be lowercase.
> Considering that it is referred to later on as "s", I suspect this is a type?

Often when working through a concept for the first time, it's simpler
to fix particular pieces; in this case, S is some fixed state type.
Then, once you get everything working, you notice that you don't make
any assumptions about S; then you are free to generalize which lets
you universally quantify.

Perhaps the tutorial should make this more clear, but this is a
process I've gone through with my own code many times; start with the
specific and generalize as needed.

In addition, type signatures are simpler with as few type variables as possible:

> get :: SM S
> put :: S -> SM ()

as opposed to

> get :: SM s s
> put :: s -> SM s ()

In the state monad case this isn't much of a difference, but I've
often found that my code wants three or four additional type variables
on a structure.  In these cases I do wish for some kind of
"parametrized module" syntax, where the module itself is quantified
over certain type variables, and the code does not need to explicitly
list them everywhere.

  -- ryan


More information about the Haskell-Cafe mailing list