At the end, I wrote:
> type Parser a = ReaderM (StateM [] String) Loc a
> type LocS = [(Loc,String)]
> data Loc = Loc { line, col :: !Int }
> item :: Parser String
> item = do x:_ <- update tail
> return x
This should have been:
> type Parser a = ReaderM (StateM [] LocS) Loc a
> type LocS = [(Loc,Char)]
> data Loc = Loc { line, col :: !Int }
> item :: Parser Char
> item = do (loc,x):_ <- update tail
> ... -- do something interesting with loc
> return x
, the intent being that you are tracking the location. OK, OK, in this case
the reader is useless, but I just wanted to test that the STM operations
lifted through the reader correctly.
One other thing: you need overlapping instances to partially instantiate the
monad transformer so you can define things like:
> class (Monad m) => STM m where
> update :: (String -> String) -> m String
> set :: String -> m String
> fetch :: m String
> set s = update (\_ -> s)
> fetch = update id
vvvvvv
> instance (Monad m) => STM (StateM m String) where
> update f = StateM (\s -> return (s, f s))
Sorry for this extra message. (It's getting to be a bad habit with me...)
--------------------------------------------------------------------------
Frank Christoph Next Solution Co. Tel: 0424-98-1811
[EMAIL PROTECTED] Fax: 0424-98-1500