> I've also been experiencing this a lot in class instances, such as:
> 
> class Foo f where
>     foo :: a -> f a
> 
> data Bar f a = Foo f => Bar {bar :: f a}
> 
> instance Foo (Bar f) where
>     foo a = Bar (foo a)
> 
> Is there any way to avoid repeating the Foo f constraint in the Bar f
> instance?



Dear Harry, et al,

The problem here is that GADT-constructors simply "carry" the appropriate 
dictionaries. When you *produce* an element of a GADT where the constructor 
requires a dictionary, you must provide it there. In this case, for a variable 
f, you don't have a dictionary, so you could read the constraint and instance 
head as "if you give me a Foo-dictionary for f, then I will wrap it in a Bar."

Another way of looking at it is that the type "Bar f" only 'exists' for 'f's 
that are 'Foo's. If you don't know whether a particular 'f' is a 'Foo', you 
don't know whether Bar f exists.

In short, I think that there is no such way.

Regards,
Philip

_______________________________________________
Glasgow-haskell-users mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to