Hi, Here is a problem I came across recently, revealing a difference between ghci and Hugs:
hugs> catch (error "not ok") (\e -> putStrLn "ok") Program error: not ok ghci> catch (error "not ok") (\e -> putStrLn "ok") *** Exception: not ok hugs> catch (ioError (userError "not ok")) (\e -> putStrLn "ok") ok ghci> catch (ioError (userError "not ok")) (\e -> putStrLn "ok") ok hugs> catch (fail "not ok") (\e -> putStrLn "ok") Program error: not ok ghci> catch (fail "not ok") (\e -> putStrLn "ok") ok As I expected, neither of them can catch "error", and both of them can catch "ioError". But only ghci can catch the "fail". It seems to me that ghc has made a convenient choice here, because if I need to raise an IO exception, it is easier to type "fail s" than "ioError (userError s)". However, the online Haskell report says that for IO, fail s = error s, which is what Hugs does. (http://www.haskell.org/onlinereport/standard-prelude.html#$iMonad$$IO) Does anyone know the reasoning behind the design choice made in the report, or why the ghc implementation is different? I am mainly concerned about portability issues: particularly, is it a good idea to use fail for raising IO exceptions? Thanks - Brian Huffman _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell