
On 11/1/06, Malcolm Wallace
"Brian Smith"
writes: Basically, the syntax for instances and derived instances would be identical, but derived instances would just omit the "where" clause, while non-derived instances would need the "where" clause.
This is a really _bad_ idea for readability. In a year's time, when this discussion is forgotten, who would be able to tell at a glance the deep and real semantic difference between the following two instance decls?
instance Num (Bar z) where and instance Num (Bar z)
The former declares that _no_ methods are defined (except for defaults), and the latter, with your proposal, that _all_ methods are defined. The real killer is that both of these decls are already valid in Haskell'98, but they mean the _same_ thing (the former, if you were wondering).
This is a sure recipe for introducing new and subtle bugs into existing bug-free programs.
Malcolm, thank you for pointing that out. To be honest, I had not read this sentence of the report (section 4.3.2 of http://haskell.org/onlinereport/decls.html): "If no binding is given for some class method then the corresponding default class method in the class declaration is used (if present); if such a default does not exist then the class method of this instance is bound to undefined and no compile-time error results." Personally, I think that the part after the semicolon is the part that leads to subtle bugs, not Brian H's proposal. Why is this not considered a compile-time error? There was a previous mention of it on the list [1] but there was no explanation given. I think it would be better if the report stated this instead: "If no binding is given for some class method then the corresponding default class method in the class declaration is used (if present); if such a default does not exist then a compile-time error results." [1] http://www.haskell.org/pipermail/haskell/2003-May/011899.html - Brian