On Fri, 5 Dec 2008, Sebastian Fischer wrote:

Dear Haskellers,

I have a question regarding the correspondence between functional
dependencies and associated types.

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

With associated types, we can define a (useless[^1]) type class

class Useless a
 where
  type T a
  useless :: a -> T a

and instances

instance Useless ()
 where
  type T () = ()
  useless = id

instance Useless a => Useless (() -> a)
 where
  type T (() -> a) = T a
  useless f = useless (f ())

Now we can compute `()` in many different ways:

   useless ()
   useless (\()->())
   ...

I thought I could express the same with a multi-parameter type class
and a functional dependency:

class UselessFD a b | a -> b
 where
  uselessFD :: a -> b

But the corresponding instances

instance UselessFD () ()
 where
  uselessFD = id

instance UselessFD a b => UselessFD (() -> a) b
 where
  uselessFD f = uselessFD (f ())

are not accepted (at least by ghc-6.10.1) without allowing undecidable
instances:

   useless.lhs:50:2:
     Illegal instance declaration for `UselessFD (() -> a) b'
       (the Coverage Condition fails for one of the functional dependencies;
        Use -XUndecidableInstances to permit this)
     In the instance declaration for `UselessFD (() -> a) b'

Is there a simple explanation for this?

GHC does not implement the same conditions for type families and functional dependencies.

Theoretically the same conditions may be used for both.

The Coverage Condition is unnecessarily restrictive. A more relaxed condition has been proposed in the literature (JFP paper on using CHRs for FDs; our ICFP'08 paper), which GHC implements for type families but not functional dependencies.

--
Tom Schrijvers

Department of Computer Science
K.U. Leuven
Celestijnenlaan 200A
B-3001 Heverlee
Belgium

tel: +32 16 327544
e-mail: [EMAIL PROTECTED]
url: http://www.cs.kuleuven.be/~toms/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to