
Simon Peyton-Jones
remember that defaulting does not happen class-by-class at the moment.
Yes, and this is exactly the point of the proposal (#2). It makes sense (to me at least) to change the rules so that defaulting happens per-class. At the moment, it _can_ occur for any class, provided only that the type is _also_ constrained to be an instance of Num. It is a very strange rule, and one that I guess very few people understand fully, yet I hope to show that one can subsume it entirely by introducing a different but more general rule, that is easier to understand.
If you have (Eq a, Fractional a) where 'a' is unconstrained, the current rules pick the first type T in the defaulting list that satisfies all the constraints (Eq T, Fractional T). I don't know what would that would mean if Eq had a different defaulting list than Fractional, as you propose.
Well, for one thing I don't like the idea of a "list" of potential defaults. My suggestion is that there should be a single default type per class. If more than one class is involved, then either their defaults should agree, or only one of them in fact declares a default. I claim that this would be sufficient for every extant use case. But I would quite like to have some evidence to back up this claim! If anyone actually uses explicit defaults in their programs, I would be interested in seeing some real data on this. Feel free to submit such example decls to my email address. I suspect that almost no-one uses defaults except for the original motivating case of literal numbers. If so, then even quite a big change in this area would hurt very few people, provided it was backward compatible with the literal number thing.
Another issue that Haskell' needs to address is what defaulting means when you have multi-parameter type classes.
Yes, I was going to mention that myself on the wiki, but it slipped my mind again. So here is one idea. If you have a single default type per class in the SPTC scenario, then you would have a single default _relation_ of types in the MPTC case. The default decl could be made to look rather like an instance decl: default Num Integer default Fractional Double class Dual d c where ... default Dual Binary [Bool] except, unlike instances, you are permitted only one of them. Regards, Malcolm