[Haskell-cafe] Functional dependenices in class declarations

Simon Peyton-Jones simonpj at microsoft.com
Thu Aug 11 05:29:55 EDT 2005


It's intentional.

Consider this data type declaration

	data B b = MkT (A a b)

Should that be accepted?  The only thing it could possibly mean would be

	data B b = MkT (forall a. A a b)

and I suppose that might possibly be useful.  But in this case you're
also saying that "a" determines "b".  But you can hardly say *forall* a,
if the choice of a determines the (fixed by context) b.

These functional dependencies are tricky things.   Martin Sulzmann and I
wrote a paper about some of the trickiness
(http://research.microsoft.com/%7Esimonpj/Papers/fd-chr/index.htm), and
we're working on a journal version.


My wild guess is that you are trying to convert an O-O idiom into
Haskell, and that's led you to a rather strange program.  Maybe there's
another way to do it.

Simon
	

| -----Original Message-----
| From: haskell-cafe-bounces at haskell.org
[mailto:haskell-cafe-bounces at haskell.org] On Behalf Of
| Frank
| Sent: 08 August 2005 18:17
| To: haskell-cafe at haskell.org
| Subject: [Haskell-cafe] Functional dependenices in class declarations
| 
| In ghc 6.4 (fine work - many gratulations to all who did it!) it is
| permitted
| to have type parameters which are reachable (7.4.3.1 context of type
| signatures).
| I tried the following:
| 
| module TypeDependencies where
| 
| class A a b | a -> b
| 
| class (A a b) => B b  where
|     op :: a -> a
| 
| x :: A a b => a -> a
| x = id
| 
| Which compiles fine for the function x, but does complain
| "not in scope: type variable 'a' " for the class (A a b) => B b.
| 
| Is this an intentional restriction that 'reachable' type variables are
only
| permitted in type definitions, but not in classes? or do I
misunderstand
| something?
| 
| Any help appreciated!
| Andrew Frank
| 
| 
| _______________________________________________
| Haskell-Cafe mailing list
| Haskell-Cafe at haskell.org
| http://www.haskell.org/mailman/listinfo/haskell-cafe


More information about the Haskell-Cafe mailing list