On Thu, Jun 9, 2011 at 09:46, DavidA <polyom...@f2s.com> wrote:
> 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

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to