hammar’s already provided a solution; I’d like to point out another problem with this example. What you want to express is “Whenever a type is an instance of Eq
and EuclideanDomain
, use this rule to make an instance for Ord
.” But this is inexpressible in Haskell. The line
instance (EuclideanDomain a, Eq a) => Ord a where
actually means, “Use this rule to make an Ord
instance for any type. It’s an error if instances of EuclideanDomain
and Eq
aren’t in scope”. That’s not good, because this rule will overlap with every other Ord instance.
Basically any time you want to write an instance Class typevar
, you’re going to need a newtype.