
Andrea Rossato wrote:
Now I'm trying to create a statefull evaluator, with
output and
exception, but I'm facing a problem I seem not to be able to conceptually solve.
If a computation fails in your monad, do you still want to return a value of the result type? I'd expect not, and hence remove the 'a' from the 'Raise' constructor. data Eval_SOI a = Raise (State -> (State, Output)) | SOIE (State -> (a, State, Output)) The above is very similar to using the monad foundation classes: import Control.Monad.Error import Control.Monad.State hiding (State) import Control.Monad.Writer type Eval_SOI = ErrorT String (StateT State (Writer Output)) ...assuming that you're happy to send back a descriptive String when a computation fails. Have a look at the Control.Monad.Error source code, to see how 'instance Error a => Monad (Either a)' is defined. It's the sort of thing you were trying to do in your 'instance Monad Eval_SOI'. Regards, Tom