[Haskell-cafe] Announce: Monad Transformer Tutorial

Tomasz Zielonka tomasz.zielonka at gmail.com
Mon Oct 9 03:44:47 EDT 2006


On Fri, Oct 06, 2006 at 11:40:46AM +0200, Martin Grabmueller wrote:
> I hereby announce a small tutorial on using monad transformers.  In contrast
> to others found on the web, it concentrates on using them, not on their
> implementation.
> 
> I'd like to hear comments, suggestions, etc. about it!

I have found it generally correct and pleasant to read, and my
co-worker, who is just learning to use monad transformers, said he found
it helpful. The problem for him was that he was reading it away from the
computer, so he couldn't check the types of various functions/methods
used by you - like liftIO. Perhaps you could warn that it's better to
read it near a running Haskell interpreter, or present the type
signatures in an appendix at the end.

No let's get to nitpicking ;-)

None of the following issues is very serious, but maybe they will help
you improve your article.

* page 5, at the end of section 2.1: it might be good to explicitly
  say that "eval1 Map.empty exampleExp" typed at ghci prompt uses
  the IO monad. Also, I think only the recent ghci versions will print
  the result of an IO action, which may be confusing for the readers

* page 7, sixth line in section 2.3: I think that talking about
  "threading" the value fits State monad better. For the Reader
  monad I would rather say something like: "A reader monad pushes a
  value to all (sub)computations", but this may be my personal bias.

* page 8, at about 85%: you say "The state maintained in our example is
  a simple integer value, but it *can* be any data type we wish". I
  think it's better to say *could*, because with *can* it could be
  (mis)understood that in a give State monad use the type of state can
  change. Also, you are mixing values with types: "simple integer
  value" vs "any data type".

* page 9: why not make "tick" polymorphic, so you won't have to
  rewrite it later (tick' and tick'') ?

* page 9: about style of eval4: it seems a bit error prone to have
  to call "tick" in every case. I would try to split eval4 into
  two mutually recursive functions: one that does the tick, and
  the other that does the actual work and calls the first one
  recursively.
  
  But then there is a risk of calling the wrong one of the two
  functions. I would try to avoid it by giving the functions
  incompatible types. Well, OK, this could divert the readers' focus
  from monad transformers... ;-)

* first code fragment on the page 4: you could write:

    runEval1 = runIdentity

  omitting the arg, but this might be a deliberate choice

* page 10, in the middle: "documentation for the WriterT monad" -
  I would add "... transformer".

* page 11, at about 40%: "because Identity is the innermost monad".
  I think "because Identity is our base monad" would be more
  appropriate.

possible typos:

* page 8, in the middle: missing left parenthesis in "type r -> r) ->
  ..."

* page 6, at about 60%, in "Map.lookup returns it result" replace "it"
  with "its"

* page 6, at about 75%, there is something wrong with "we" in "... even
  shorter (better?) we exploiting the fact ..."

Best regards
Tomasz


More information about the Haskell-Cafe mailing list