readers of this thread might find ghc ticket #1241 relevant

   http://hackage.haskell.org/trac/ghc/ticket/1241

class T root pos sel | pos -> root, root -> sel where
   f :: pos -> sel -> Bool
instance T root (Any root) sel

But the same applies to the second functional dependency and the type
variable sel. Every instantiation of root determines the instantiation
of sel. And that forbids instance T Int (Any Int) Bool and instance T
Int (Any Int) Int inside the same scope, doesn't it?

Indeed that is your intent, expressed in the functional dependency. ..

then i wonder why that intent is not taken into account in the semantics you
outline, which is widely used, but stems from the days before functional dependencies.
In our example, an unground
instance |instance T root (Any root) sel| is equivalent to a set of
ground instances where |root| and |sel| are replaced with all possible
ground types. Including
instance T Int (Any Int) Bool
instance T Int (Any Int) Int
These two instances are in the model for `instance T root (Any root) sel'.

yes, but are they still in the model for that instance _under the dependency_?

instance T root (Any root) sel | Any root->root,root->sel
the difference seems a bit like that between these two qualified lists

   [instance T root (Any root) sel | root<-types,sel<-types]

   vs

   [instance T root (Any root) sel | root<-types,sel<-types,Any 
root->root,root->sel]

where one can either complain that some elements of the first list do not 
fulfill
some of the qualifiers in the second, or one can filter out those elements, and see whether the remainder is useable.

or qualified types, if we see functional dependencies as type predicates

   f :: T root pos sel => pos -> sel -> Bool

   vs

f :: (T root pos sel,pos->root,root->sel) => pos -> sel -> Bool
where one can either complain that f isn't as polymorphic as the first type 
suggests,
or one can take the additional type qualifiers into account.

i'm not sure i have an opinion about all this anymore - it used to seem obvious 
to me
that FDs, like qualified types, restrict polymorphism. but it has also become 
obvious
that not everyone agrees with what i thought was the straightforward 
interpretation.

i would be interested, however, if you -or anyone else who hasn't given up on 
FDs
yet, could elaborate on what is wrong with this interpretation?

thanks,
claus

ps i don't think that questions like this will simply go away by switching to a different front-end, like associated types.
A set of instances, an
implementation of a type class, must satisfy the interface, that is,
constraints imposed by the class declaration, including the functional
dependency constraints. In our example, any implementation of T must
satisfy root -> sel constraints. The above two instances show there
exists a model of T where the functional dependency is
violated. That's why both GHC 6.4 and Hugs reject the instance. Again,
it is a mystery why GHC 6.6 accepts it.

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to