Type Inference behaving non intuitively with Functional Dependencies

  • Why does Haskell have functional dependencies?

    Because multi-parameter type classes can sometimes have ambiguous instances.

  • Why does Haskell have multi-parameter type classes?

    Because the original (single parameter) type classes limited expressivity.

  • Why does Haskell have type classes?

    To provide a means of reusing symbols with different types - overloading.

Having recently seen this:

and having already seen this some time ago:

…is the very concept of a type class a mistake (or at least flawed)? Because it seems to me that the “Jenga-tower” of a type system Haskell now has is largely the consequence of that original decision.