
On Sun, 14 Dec 2008, Mario Bla?evi? wrote:
I'll take a swing at this one:
instance Container (Maybe x) [x] where wrapper = isNothing . . .
That isn't a sensible definition of 'wrapper', but I believe without trying to compile it is completely legal. Which wrapper do you use?
You /don't/ have a different matching Container instance, but without the functional dependency you /might/, and ghc barfs.
But liftWrap doesn't require any particular instance, it's a generic function accepting any pair of types for which there is an instance of Container. Instance selection (as I understand it) shouldn't come into play until one applies liftWrap to a particular type, and indeed it does cause problems there: note the type annotations on the last line. That part I understand and accept, or at least have learned to live with.
Yes, that is an intuitive understanding to us humans, but the instance selection applies seperately for 'wrapper' and 'listWrap'; ghc doesn't automatically prefer a particular instance just because it is in the context of the calling function. --L