Functional Dependencies

Simon Peyton-Jones simonpj at
Thu Aug 11 05:41:19 EDT 2005

You raise a vexed question, which has been discussed a lot.  Should this

	class C a b | a -> b 
	instance C Int Bool

	f :: forall a. C Int a => a -> a
	f x = x

GHC rejects the type signature for f, because we can see that 'a' *must
be* Bool, so it's a bit misleading to universally quantify it.   


| -----Original Message-----
| From: glasgow-haskell-users-bounces at
| bounces at] On Behalf Of Dirk Reckmann
| Sent: 21 July 2005 10:30
| To: glasgow-haskell-users at
| Subject: Functional Dependencies
| Hello everybody!
| I wanted to have some fun with functional dependencies (see
|, and tried some
| examples from this paper as well as some own experiments. The idea is
to use
| the type checker for computations by "abuse" of type classes with
| dependencies.
| The example in the attached file is taken from the above paper. Due to
| functional dependencies, I expected the type of seven to be uniquely
| determined to be (Succ (Succ (Succ ...))), i. e. seven, but ghc
(version 6.4)
| gives me following error message:
| Add.hs:14:0:
|     Couldn't match the rigid variable `a' against `Succ s'
|       `a' is bound by the type signature for `seven'
|       Expected type: Succ s
|       Inferred type: a
|     When using functional dependencies to combine
|       Add (Succ n) m (Succ s), arising from the instance declaration
| Add.hs:11:0
|       Add (Succ (Succ (Succ Zero))) (Succ (Succ (Succ (Succ Zero))))
|         arising from the type signature for `seven' at Add.hs:13:0-77
|     When generalising the type(s) for `seven'
| However, using the definition of Add to define Fibonacci numbers does
| and a similar function declaration can be used to compute numbers by
the type
| checker.
| The same definition of Add works in Hugs...
| So, is this a bug in ghc, or am I doing something wrong?
| Thanks in advance,
| 	Dirk Reckmann

More information about the Glasgow-haskell-users mailing list