The docos say [User Guide 10.14.1. on Equality Constraints]

> Equality constraints can also appear in class and instance
contexts.
> The former enable a simple translation of programs using
> functional dependencies into programs using family
synonyms instead. 
http://downloads.haskell.org/~ghc/8.0.2/docs/html/users_guide/glasgow_exts.html#equality-constraints

And the forms of constraint seem quite sophisticated.
I was surprised (pleased) I could do this:

{-# LANGUAGE   MultiParamTypeClasses, TypeFamilies,
                             FlexibleInstances #-}

type family F a

class (F a ~ (b, c) ) => C a b c   where       -- (b c) !!
  f1 :: a -> b
  f2 :: a -> c

Uses of `f1` happily improve the type for `b`.
Uses of `f2` happily improve the type for `c`.

But I didn't declare a Functional Dependency.
(It seems to do no harm if I add `| a -> b c`.)

GHC's behaviour seems stronger than a "simple translation".
It seems entirely equivalent to a FunDep.

Or is there something I'm missing?
(I could have overlapping instances,
 but only providing the equations for
 type family `F` are confluent.)

Are there restrictions on the form of Equality Constraints
to get them to behave as FunDeps?
(It's not merely a bare typevar on one side.)

AntC
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/glasgow-haskell-users

Reply via email to