[Haskell-cafe] Ord instances (Was: Unnecessarily strict implementations)

Henning Thielemann schlepptop at henning-thielemann.de
Sun Sep 5 16:10:36 EDT 2010


Neil Brown schrieb:
> On 03/09/10 11:11, Henning Thielemann wrote:
>>
>> E.g. I wanted to have a Set of Gaussian (complex) integers, but I did
>> not want to define an Ord instance for them, because writing
>>   a < (b :: Gaussian)
>> is a bug with high probability.
> 
> Isn't this what newtype is good for?  Instead of declaring Ord Gaussian
> to get Set Gaussian and risking the bug you describe, create newtype
> GaussianInSet = G Gaussian, declare Ord GaussianInSet and use Set
> GaussianInSet.

If I use a newtype then I need to lift the numeric operations to that
newtype, and then chances are great that I use (<) with wrong
expectations on the newtyped Gaussians.


My concrete application was an implementation of partial fractions,
where I used a Map from a root and its multiplicity in the denominator
to the numerator. E.g.

(3x+1)/(x+4)^2 + 5/(x-7)

is represented by

{(4,2) -> polynomial [1,3], (-7,1) -> polynomial [5]}

In order to support complex numbers (in this case not only Gaussian
integers) and not forcing an Ord instance, I introduced a new type
class, like ArbitraryOrdered, used a newtype to map this class to Ord
and used this for the Map that represents the partial fraction.


More information about the Haskell-Cafe mailing list