
In Martin Grabmuller's tutorial "Monad Transformers Step by Step", found here http://user.cs.tu-berlin.de/~magr/pub/Transformers.pdf he gives an example of composing ErrorT, StateT, ReaderT, and WriterT. Early in the paper, where he composes just ErrorT and ReaderT type Eval3 a = ReaderT Env (ErrorT String Identity) a he uses 'ask' and 'throwError' in some example code. I notice that he doesn't have to lift throwError into the ErrorT monad. Why is this? Do I misunderstand something about monad transformers? Is it a convenience definition of throwError? Same thing the rest of the paper. I don't see anywhere he lifts anything. Thanks, Mike

Michael P Mossey wrote:
In Martin Grabmuller's tutorial "Monad Transformers Step by Step", found here
Additional question: in this paper he uses a data constructor in an interesting way: back-quoting it to make it an operator. I thought, "Huh, a constructor is a lot like a function?" I did some experiments and found that I can map a constructor over a list and I can compose a constructor with other functions. Cool. So is a constructor a function, in every sense? Thanks, Mike

Michael P Mossey wrote:
Michael P Mossey wrote:
In Martin Grabmuller's tutorial "Monad Transformers Step by Step", found here
Additional question: in this paper he uses a data constructor in an interesting way: back-quoting it to make it an operator. I thought, "Huh, a constructor is a lot like a function?" I did some experiments and found that I can map a constructor over a list and I can compose a constructor with other functions. Cool. So is a constructor a function, in every sense?
Yes. In expressions, a constructor is a function, no more and no less (albeit with some weird capitalization). Constructors however, can *also* be used in pattern-matching, unlike functions. That's the (only?) special thing about them. -Isaac

On Aug 14, 2009, at 20:55 , Michael P Mossey wrote:
In Martin Grabmuller's tutorial "Monad Transformers Step by Step", found here
http://user.cs.tu-berlin.de/~magr/pub/Transformers.pdf
he gives an example of composing ErrorT, StateT, ReaderT, and WriterT. Early in the paper, where he composes just ErrorT and ReaderT
type Eval3 a = ReaderT Env (ErrorT String Identity) a
he uses 'ask' and 'throwError' in some example code. I notice that he doesn't have to lift throwError into the ErrorT monad. Why is this? Do I misunderstand something about monad transformers? Is it a convenience definition of throwError?
Look for definitions of the form
instance MonadReader Eval3 where ... instance MonadError Eval3 where ...
These effectively "import" definitions of ask, throwError, etc. with implicit lifting. -- brandon s. allbery [solaris,freebsd,perl,pugs,haskell] allbery@kf8nh.com system administrator [openafs,heimdal,too many hats] allbery@ece.cmu.edu electrical and computer engineering, carnegie mellon university KF8NH
participants (3)
-
Brandon S. Allbery KF8NH
-
Isaac Dupree
-
Michael P Mossey