[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