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

Henning Thielemann lemming at henning-thielemann.de
Tue Mar 24 17:35:30 EDT 2009


On Tue, 24 Mar 2009, Xiao-Yong Jin wrote:

> Jake McArthur <jake at pikewerks.com> writes:
>
>> Xiao-Yong Jin wrote:
>> | The problem is that there will be many functions using such
>> | a function to invert a matrix, making this inversion
>> | function return Either/Maybe or packing it in a monad is
>> | just a big headache.
>>
>> I disagree. If you try to take the inverse of a noninvertable matrix,
>> this is an *error* in your code. Catching an error you created in pure
>> code and patching it with chewing gum it is just a hack. A monadic
>> approach (I'm putting Either/Maybe under the same umbrella for brevity)
>> is the only solution that makes any sense to me, and I don't think it's
>> ugly as you are making it out to be.
>>
>
> Then, why is 'div' not of type 'a -> a -> ArithExceptionMonad a' ?
> Why does it throws this /ugly/ /error/ when it is applied to
> 0?

I think "throw" should be reserved to exceptions (although it is still 
strange English). Actually 'div x 0' is 'undefined', just like in 
mathematics. This is justified by the fact, that you can easily check 
whether the denominator is zero or not and it is expected that either you 
check the denominator before calling 'div' or that you proof that in your 
application the denominator is non-zero anyway and thus save repeated 
checks for zero at run-time. The deficiency is not in 'div' but in the 
type system, which does not allow to declare an Int to be non-zero. In 
contrast to that, it is not easily checked, whether a matrix is regular. 
Thus you may prefer a Maybe result.


More information about the Haskell-Cafe mailing list