
On Tue, 24 Mar 2009, Xiao-Yong Jin wrote:
Jake McArthur
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.