simonpj at microsoft.com
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 haskell.org
| bounces at haskell.org] On Behalf Of Dirk Reckmann
| Sent: 21 July 2005 10:30
| To: glasgow-haskell-users at haskell.org
| Subject: Functional Dependencies
| Hello everybody!
| I wanted to have some fun with functional dependencies (see
| http://www.cs.chalmers.se/~hallgren/Papers/wm01.html), and tried some
| examples from this paper as well as some own experiments. The idea is
| the type checker for computations by "abuse" of type classes with
| 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
| gives me following error message:
| 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 (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 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