
I think this thread is discussing your proposal 2, ignoring 1. | default Ord Integer | default Fractional Float | (Ord a, Fractional a) => a | | --> static error, because Ord is not a superclass of Fractional, so | the context does not simplify, and the default types disagree. Ah, that's the example I was trying to get at. OK, so your rule is that both must give the same answer. Fine. | > Suppose I have | > default Eq Integer | > default Fractional Float | > and I have (Eq a, Fractional a). Does 'a' resolve to Integer or to Float? Perhaps a few examples on | the proposal page would be useful for readers? | | The proposed rule is that defaulting applies *after* simplification of | the context. So, although you initially infer | (Eq a, Fractional a) => a | but after simplification, this becomes | (Fractional a) => a | so there is a single class to be defaulted, and Float is chosen. Delicate, this. Suppose you had (Eq a, Foo a b, Num b) If I start with (Eq a) I might choose Integer. But if I start with Num b, I might choose default b=Float. Suppose I have instance Fractional a => Foo a Float Now I simplify (Foo a Float) to get Fractional a, and now I should choose a=Float. Not very confluent. Tricky Simon