X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FIOBase.lhs;h=72cf045a6ebcb6995464420449d62d43abee5d57;hb=ff719fd9d3b8dc30cff887beca7d2c0d823781e0;hp=6f7d9c9038da44a697fe42171222468ec1fa0d84;hpb=72f3710df6ac24bcad82b3f7fd158aa8c14ee86f;p=ghc-base.git diff --git a/GHC/IOBase.lhs b/GHC/IOBase.lhs index 6f7d9c9..72cf045 100644 --- a/GHC/IOBase.lhs +++ b/GHC/IOBase.lhs @@ -182,7 +182,7 @@ unsafePerformIO (IO m) = case m realWorld# of (# _, r #) -> r 'unsafeInterleaveIO' allows 'IO' computation to be deferred lazily. When passed a value of type @IO a@, the 'IO' will only be performed when the value of the @a@ is demanded. This is used to implement lazy -file reading, see 'IO.hGetContents'. +file reading, see 'System.IO.hGetContents'. -} {-# NOINLINE unsafeInterleaveIO #-} unsafeInterleaveIO :: IO a -> IO a @@ -471,14 +471,11 @@ showHandle p h duplex = -- has a constructor in the 'Exception' type, and values of other -- types may be injected into 'Exception' by coercing them to -- 'Dynamic' (see the section on Dynamic Exceptions: "Control.Exception\#DynamicExceptions"). --- --- For backwards compatibility with Haskell 98, 'IOError' is a type synonym --- for 'Exception'. data Exception = ArithException ArithException -- ^Exceptions raised by arithmetic -- operations. (NOTE: GHC currently does not throw - -- 'ArithException's). + -- 'ArithException's except for 'DivideByZero'). | ArrayException ArrayException -- ^Exceptions raised by array-related -- operations. (NOTE: GHC currently does not throw @@ -651,6 +648,7 @@ instance Eq Exception where BlockedOnDeadMVar == BlockedOnDeadMVar = True NonTermination == NonTermination = True Deadlock == Deadlock = True + _ == _ = False -- ----------------------------------------------------------------------------- -- The ExitCode type @@ -678,42 +676,46 @@ throw exception = raise# exception -- | A variant of 'throw' that can be used within the 'IO' monad. -- --- Although 'ioError' has a type that is an instance of the type of 'throw', the +-- Although 'throwIO' has a type that is an instance of the type of 'throw', the -- two functions are subtly different: -- -- > throw e `seq` return () ===> throw e --- > ioError e `seq` return () ===> return () +-- > throwIO e `seq` return () ===> return () -- -- The first example will cause the exception @e@ to be raised, --- whereas the second one won\'t. In fact, 'ioError' will only cause +-- whereas the second one won\'t. In fact, 'throwIO' will only cause -- an exception to be raised when it is used within the 'IO' monad. --- The 'ioError' variant should be used in preference to 'throw' to +-- The 'throwIO' variant should be used in preference to 'throw' to -- raise an exception within the 'IO' monad because it guarantees -- ordering with respect to other 'IO' operations, whereas 'throw' -- does not. -ioError :: Exception -> IO a -ioError err = IO $ \s -> throw err s +throwIO :: Exception -> IO a +throwIO err = IO $ \s -> throw err s ioException :: IOException -> IO a ioException err = IO $ \s -> throw (IOException err) s +ioError :: IOError -> IO a +ioError = ioException + -- --------------------------------------------------------------------------- -- IOError type --- A value @IOError@ encode errors occurred in the @IO@ monad. --- An @IOError@ records a more specific error type, a descriptive +-- | The Haskell 98 type for exceptions in the @IO@ monad. +-- In Haskell 98, this is an opaque type. +type IOError = IOException + +-- |Exceptions that occur in the @IO@ monad. +-- An @IOException@ records a more specific error type, a descriptive -- string and maybe the handle that was used when the error was -- flagged. - -type IOError = Exception - data IOException = IOError { ioe_handle :: Maybe Handle, -- the handle used by the action flagging -- the error. ioe_type :: IOErrorType, -- what it was. ioe_location :: String, -- location. - ioe_descr :: String, -- error type specific information. + ioe_description :: String, -- error type specific information. ioe_filename :: Maybe FilePath -- filename the error is related to. } @@ -749,7 +751,7 @@ instance Eq IOErrorType where x == y = case x of DynIOError{} -> False -- from a strictness POV, compatible with a derived Eq inst? - _ -> getTag# x ==# getTag# y + _ -> getTag x ==# getTag y instance Show IOErrorType where showsPrec _ e = @@ -777,7 +779,7 @@ instance Show IOErrorType where DynIOError{} -> "unknown IO error" userError :: String -> IOError -userError str = IOException (IOError Nothing UserError "" str Nothing) +userError str = IOError Nothing UserError "" str Nothing -- --------------------------------------------------------------------------- -- Showing IOErrors