At times, I run into the "feature" that Haskell only matches instance heads, namely,
instance (a ~ NewDataTyp b) => C a
will now match any type whatsoever, i.e. writing another instance declaration of C
in your program will is an error, even if it cannot possibly conflict due to the context a ~ NewDataTyp b
. At times, it takes a lot of effort to overcome; I've had to restructure hundreds of lines of code to avoid this limitation.
Are there any language extensions, or descendant languages (Curry? Agda?) that are designed with a higher priority for expressiveness? This could possibly sacrifice (a) openness of the typeclass world (b) polynomial time typechecking.
edit -- for those interested in the question, this page might also be of interest: http://www.haskell.org/haskellwiki/Future_of_Haskell
For what it's worth, Scala accepts the more-or-less literal translation of what you just wrote. I'm not sure how useful it is.