
On Thu, Jun 9, 2011 at 09:46, DavidA
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.
You can do this using GADTs. Like this: data Graph a where G :: Ord a => [a] -> [[a]] -> Graph a Now functions that pattern match on the 'G' constructor automatically have the Ord instance in scope, so it is no longer needed in the signature. Erik