monad transformer library (was: in list transformer)
Ross Paterson
ross@soi.city.ac.uk
Wed, 4 Jun 2003 21:37:39 +0100
On Wed, Jun 04, 2003 at 11:38:16AM -0700, Iavor Diatchki wrote:
> well, in the old library there didn't seem to be a particular structure
> (perhaps this is what you mean by diagonal). for example:
> * the instance that StateT is a writer (if underlying monad is a
> writer) is in State.hs
> * the instance that ReaderT is a writer (if underlying monad is a
> writer) is in Writer.hs
The structure was that the monads were arranged in a sequence:
Reader, Writer, State, RWS, Cont, Error, List
Module n would import modules 1..n-1, introduce Mn and corresponding
classes, make Mn an instance of all earlier classes and make previous
monads instances of the new classes. If you picture a matrix of types
vs classes, it was walking down the diagonal.
As for where to place instances, SimonM has the following in the
(much-overlooked) library document:
A module corresponding to a class (e.g. Bits) contains the class
definition, perhaps some auxiliary functions, and all sensible
instances for Prelude types, but nothing more. Other modules
containing types for which an instance for the class in question
makes sense contain the code for the instance itself.
which makes sense to me, though maybe I'd put several classes in one
module.
> >Resumptions may be generalized to
> >
> > newtype ResumeT f m a = Re { unRe :: m (Res f m a) }
> > data Res f m a = Value a | Delay (f (ResumeT f m a))
> >
> >where f is a functor.
>
> interesting, i hadn't seen that. this will also make the Resume monad a
> little more interesting
> (it used to be kind of like the natural numbers). i'll add that. is
> there a paper where they discuss that? i also haven't really proved the
> monad laws, hopefully they still work.
One of Moggi's later ones, I think.