
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. Cheers, Simon