| type IOError = IOError | 
| userError :: String -> IOError | 
| mkIOError :: IOErrorType | 
| -> String -> Maybe Handle -> Maybe FilePath -> IOError | 
| annotateIOError :: IOError | 
| -> String -> Maybe Handle -> Maybe FilePath -> IOError | 
| isAlreadyExistsError :: IOError -> Bool | 
| isDoesNotExistError :: IOError -> Bool | 
| isAlreadyInUseError :: IOError -> Bool | 
| isFullError :: IOError -> Bool | 
| isEOFError :: IOError -> Bool | 
| isIllegalOperation :: IOError -> Bool | 
| isPermissionError :: IOError -> Bool | 
| isUserError :: IOError -> Bool | 
| data IOErrorType | 
| instance Eq IOErrorType | 
| instance Show IOErrorType | 
| alreadyExistsErrorType :: IOErrorType | 
| doesNotExistErrorType :: IOErrorType | 
| alreadyInUseErrorType :: IOErrorType | 
| fullErrorType :: IOErrorType | 
| eofErrorType :: IOErrorType | 
| illegalOperationErrorType :: IOErrorType | 
| permissionErrorType :: IOErrorType | 
| userErrorType :: IOErrorType | 
| ioError :: IOError -> IO a | 
| catch :: IO a -> (IOError -> IO a) -> IO a | 
the function f returns [] when an end-of-file exception (cf. isEOFError) occurs in g; otherwise, the exception is propagated to the next outer handler.
When an exception propagates outside the main program, the Haskell system prints the associated IOError value and exits the program.
| try :: IO a -> IO (Either IOError a) |