Earlier quoted context omitted.
The distinction between your point and mine is becoming miniscule, but I must defend my position on Haskell, as a heavy user myself. If Num doesn't seem to be a problem to you, it's because you supply top-level annotations that disambiguate it. Try removing all the annotations from whatever you did last week and see if it still compiles cleanly. I'd wager it doesn't. This isn't an issue in practice because we supply…
This is one of the files in a project I've worked on last week. https://github.com/Peaker/bottle/blob/master/codeedit/Editor... I removed all the top-level type declarations, and only one definition broke, because of the MR. showP :: Show a => a -> String showP = parenify . show Once I removed the type declaration, I made it work again by adding a parameter to avoid the MR: showP x = parenify (show x) and everything…
This is very good code.
One difference I see between our styles that may explain the differences in behavior we see is that you're quite meticulous about importing only the parts of modules you need, and you make heavy use of qualified imports. My style has been to import everything in case I need it later and only use qualified imports when absolutely necessary, and it must be creating the unnecessary ambiguity that I have to deal with. I will try to adopt your style and see if it cleans up my error messages, and I'll encourage my friends to do the same.