
Malcolm Wallace
data Bar f a = Foo f => Bar {bar :: f a}
The class context on the data constructor buys you nothing extra in terms of
expressivity in the language.
All it does is force you to repeat the context on every function that uses the datatype. For this reason, the language committee has decided that the feature will be removed in the next revision of Haskell.
Regards, Malcolm
"All it does is force you to repeat the context on every function that uses the datatype" I think that's exactly what the original poster is complaining about. As a real- life example, consider data Graph a = Ord a => G [a] [[a]] My intention is that whenever I have a Graph a, I want to be able to use the Ord instance on a. So suppose I now define automorphisms :: (Ord a) => Graph a -> [Permutation a] On the basis of the "don't repeat yourself" principle, it seems redundant to have to specify the (Ord a) context here, since I already specified it in the data constructor for Graph a. So this is a proposal for a change to the language: don't require a context on a function if it is already implied by a context on a data type. (This would make even more sense for newtypes, where we know there is exactly one data constructor, so no possibility of different data constructors requiring different contexts.)