[Haskell-cafe] Control.Monad.Error with a custom error type

Tom Pledger tpledger at ihug.co.nz
Sat Aug 14 23:30:36 EDT 2004

Brian Smith wrote:

> [...]
> > instance MonadError (Either ReferenceError)
>  Kind error: `Either ReferenceError' is not applied to enough type 
> arguments
>  When checking kinds in `MonadError (Either ReferenceError)'
>  In the instance declaration for `MonadError (Either ReferenceError)' 

MonadError takes two parameters: the error type (with kind *) and the 
monad (with kind *->*).  So:

    instance MonadError ReferenceError (Either ReferenceError)

Unfortunately this takes you into the realm of Overlapping Instances.  I 
recommend that you instead extend ReferenceError so that it /can/ be 
made an instance of Error:

    data ReferenceError = {- what you already had -} | NonRefError String

...and bear in mind that NonRefError will only occur when the fail 
method or the mzero method is used, which won't happen much if you 
consistently use throwError instead.  It sometimes helps to define a 
function which catches one sort of error and lets others through:

    -- untested
    m `onRefError` h
        = m `catchError` \e ->
          case e of
              RefError{} -> h (expectedType e) (pointOfError e)
              _          -> throwError e


More information about the Haskell-Cafe mailing list