[Haskell-cafe] Fundeps and overlapping instances

Iavor Diatchki iavor.diatchki at gmail.com
Thu May 31 06:26:06 CEST 2012


the notion of a functional dependency is well established, and it was used
well before it was introduced to Haskell (for example, take a look at
http://en.wikipedia.org/wiki/Functional_dependency).  So I'd be weary to
redefine it lightly.
Note that placing a functional dependency constraint is just one way to
allow class methods that don't mention all class variables.  If the
instances for the class do not satisfy the functional dependency (as in
your example), you can refactor your class hierarchy, instead.  For example:

class D a where  k :: a
class D a => C a b where  f :: a -> b

instance D Int where k = 2
instance C Int b where f _ = Nothing

I hope this helps,

On Wed, May 30, 2012 at 1:31 PM, Etienne Laurin <etienne at atnnn.com> wrote:

> Hello,
> I disagree with your example.
> > 1. Check that an instance is consistent with itself.  For example, this
> > should be rejected:
> >
> > instance C a b
> >
> > because it allows C Int Bool and C Int Char which violate the functional
> > dependency.
> Functional dependencies are not used to pick types, they are used to
> pick instances.
> class C a b | a → b where
>  k ∷ a
>  f ∷ a → Maybe b
> The functional dependency allows you to have a method such as k that
> doesn't use all the arguments of the class.
> I expect to be able to make a instance that works for any b.
> instance C Int b where
>  k = 2
>  f _ = Nothing
> Etienne Laurin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20120530/8254b237/attachment.htm>

More information about the Haskell-Cafe mailing list