base package

Simon Marlow marlowsd at
Thu Feb 21 10:42:24 CET 2013

On 20/02/13 15:40, Joachim Breitner wrote:

> +-- | This exception is thrown by the 'fail' method of the 'Monad' 'IO' instance.
> +--
> +--   The Exception instance of IOException will also catch this, converting the
> +--   IOFail to a UserError, for compatibility and consistency with the Haskell
> +--   report
> +data IOFail = IOFail String
> +
> +instance Typeable IOFail -- deriving does not work without package
> +instance Show IOFail     -- name changes to GHC
> +instance Exception IOFail
> +

I like the idea of making IOFail a separate exception type.

> -instance Exception IOException
> +instance Exception IOException where
> +    toException = SomeException
> +    fromException e = case cast e of
> +        Just (IOFail s) -> Just (userError s)
> +        Nothing -> cast e

I think that should be

 > +    fromException (SomeException e) = case cast e of
 > +        Just (IOFail s) -> Just (userError s)
 > +        Nothing -> cast e

Otherwise it will typecheck but not work (hurrah for dynamic typing).

The trick is indeed neat, but only if it is possible to make IOFail 
completely invisible.  If it isn't possible to make it completely 
invisible, then I would prefer IOFail to be a first-class exception type 
without the special trick to coerce it to IOException, and accept the 
API breakage.  I don't think it's a good idea to have special magic in 
the exception hierarchy - other people would start doing it too, then 
we'd have a mess.


More information about the Glasgow-haskell-users mailing list