In hoc signo vinces (Was: Revamping the numeric classes)

William Lee Irwin III
Fri, 9 Feb 2001 12:55:12 -0800

Fri, 09 Feb 2001 10:52:39 +0000, Jerzy Karczmarczuk pisze:
>> Again, a violation of the orthogonality principle. Needing division
>> just to define signum. And of course a completely different approach
>> do define the signum of integers. Or of polynomials...

On Fri, Feb 09, 2001 at 07:19:21PM +0000, Marcin 'Qrczak' Kowalczyk wrote:
> So what? That's why it's a class method and not a plain function with
> a single definition.
> Multiplication of matrices is implemented differently than
> multiplication of integers. Why don't you call it a violation of the
> orthogonality principle (whatever it is)?

Matrix rings actually manage to expose the inappropriateness of signum
and abs' definitions and relationships to Num very well:

class  (Eq a, Show a) => Num a  where
    (+), (-), (*)   :: a -> a -> a
    negate          :: a -> a
    abs, signum     :: a -> a
    fromInteger     :: Integer -> a
    fromInt         :: Int -> a -- partain: Glasgow extension

Pure arithmetic ((+), (-), (*), negate) works just fine.

But there are no good injections to use for fromInteger or fromInt,
the type of abs is wrong if it's going to be a norm, and it's not
clear that signum makes much sense.

So we have two totally inappropriate operations (fromInteger and
fromInt), one operation which has the wrong type (abs), and an operation
which doesn't have well-defined meaning (signum) on matrices. If
we want people doing graphics or linear algebraic computations to
be able to go about their business with their code looking like
ordinary arithmetic, this is, perhaps, a real concern.

I believe that these applications are widespread enough to be concerned
about how the library design affects their aesthetics.

<craving> Weak coffee is only fit for lemmas.