
6 Jun
2011
6 Jun
'11
10:31 a.m.
On Sun, 05 Jun 2011 19:53:50 +0300, Guy
So in my original example, why isn't "instance Foo (Bar f)" destructing Bar - and making the constraint available?
The "Bar" in "instance Foo (Bar f)" is a type constructor, not a data constructor like the X in "s (X x)". Hence "instance Foo (Bar f)" isn't really deconstructing anything, but applying the type constructor Bar to f, whereas "s (X x)" matches a _value_ of type X. This might be a bit clearer if you name type and data constructors differently, e.g.: data Bar f a = Foo f => MkBar { bar :: f a } Cheers, Daniel