[Haskell-cafe] Re: Exception handling in numeric computations

Henning Thielemann lemming at henning-thielemann.de
Sat Mar 28 16:49:33 EDT 2009


On Sat, 28 Mar 2009, John Lato wrote:

>> From: Donn Cave <donn at avvanta.com>
>>
>> I have never felt that I really understood that one.
>
> Honestly, me neither, until recently.  I'm only barely starting to
> understand it, and I do think there's a great deal of overlap.  Even
> if an error is a bug that can be fixed by the programmer, certain
> exceptional situations can also be fixed by the programmer by handling
> the exception, even if they can't be detected in advance.

For example?

Btw. not handling an exception is an error.

>> I will also guess if the file is unreadable because of an external
>> I/O problem like no read access to file or filesystem, you would
>> similarly expect this to be treated like that - I mean, ideally, e.g.,
>> hGetLine :: Handle -> IO (Either IOError String)
>
> Not necessarily, but possibly.  The big difference, of course, is that
> decoding can be a pure operation, while reading never is.
>
> I personally wouldn't mind if hGetLine had the type you give.  The way
> I see it, there are two advantages to exceptions in this case.  The
> first is that it's very easy for exceptions to trickle up and be
> handled at a higher level.  The second 'advantage' is that the
> programmer doesn't need to explicitly handle exceptions, whereas an
> Either would require at least a pattern match to use the resulting
> value.

  I'm afraid there is some confusion about what we mean with "exception". 
Do you only mean the thing that is silently handled in the IO monad? Is 
Left in Either an exception for you, too? In explicit-exception I call the 
corresponding constructor Exception, because that's what it is used for.
  I like to call all those things exceptions, because they are intended for 
the same purpose: Signalling exceptional situations that we cannot avoid 
in advance but that must be handled when they occur. You can use IO and 
its exceptions, I call them IO exceptions. It does not show in its types 
that and which exceptions can occur. Some people consider this an 
advantage, I consider this an disadvantage. You can use error codes or 
Either or even better Exceptional from the explicit-exception package, and 
Haskell is strong enough to treat these like exceptions in 
C++/Java/Modula-3 etc. because you can use their monad transformer 
variants ErrorT and ExceptionalT respectively. Those monad transformers 
allow automatical termination of a series of actions once an exceptional 
result is obtained. But since ErrorT and ExceptionalT are burned into the 
types, you cannot miss to handle them.
  So the most convenient type for hGetLine would be
    hGetLine :: Handle -> ErrorT IOError IO String


More information about the Haskell-Cafe mailing list