H98: Ix class

Matt Harden matth@mindspring.com
Mon, 10 Sep 2001 21:18:40 -0500

Simon Peyton-Jones wrote:
> Folks, (esp Matt, Jan-Willem)
> Back from ICFP, I have resumed my increasingly small circles around the
> Revised Haskell 98 Report.
> In an earlier message (which I enclose for your convenience) I proposed
> to:
>         a) Remove Ord from Ix's superclasses
>         b) Add rangeSize to Ix's methods (with a suitable default
> method)
> As we implemented these changes we discovered that change (a) actually
> breaks existing programs.  Of course it does: now you have to add Ord to
> the signature of any function that compares indices.

Only if such code already has a type signature attached.  People should
just trust in type inference. (;

> This really does
> happen (for example, it happens even in the code for the Array library
> in the Report).

I mentioned this in my original note about this issue.  To quote myself:

>> One change would have to be made in the Array module if Ord is removed
>> from Ix:
>>         instance  (Ix a, Eq b)  => Eq (Array a b)  where
>>             a == a'             =  assocs a == assocs a'
>>         instance  (Ix a, Ord b) => Ord (Array a b)  where
>>             a <=  a'            =  assocs a <=  assocs a'
>> would become:
>>         instance  (Ix a, Eq a, Eq b)   => Eq (Array a b)  where
>>             a == a'             =  assocs a == assocs a'
>>         instance  (Ix a, Ord a, Ord b) => Ord (Array a b)  where
>>             a <=  a'            =  assocs a <=  assocs a'

> I should have realised this before, but
>                 I therefore withdraw proposal (a).
> It now looks like a perhaps-desirable, but definitely un-forced change,
> and that goes beyond my remit.

That's OK.  I personally don't think it's likely to break anyone's code
outside the Array and Ix modules themselves, but I certainly understand
(and agree with) the desire to minimize changes to H98.  I just didn't
like the idea of having to create an arbitrary Ord instance for Ix types
where there might not be a "natural" comparison.  Especially when the
only reason for it is to allow Arrays to be compared.

> However (b) doesn't break anything, I think, so I propose to let it
> stand.
> (The two are independent I think.)

Agreed; they are independent.  (b) was much more important to me,

> Does anyone want to argue that having Ord as a superclass of Ix is So
> Bad
> that it Absolutely Must Be Removed?

I'll pass.