# Problem with functional dependencies

**Lennart Augustsson
**
lennart@augustsson.net

*Thu, 21 Dec 2000 13:11:33 +0100*

Simon Peyton-Jones wrote:
>* I think you can simplify the example. Given
*>*
*>* class HasFoo a b | a -> b where
*>* foo :: a -> b
*>*
*>* instance HasFoo Int Bool where ...
*>*
*>* Is this legal?
*>*
*>* f :: HasFoo Int b => Int -> b
*>* f x = foo x
*>*
*>* You might think so, since
*>* HasFoo Int b => Int -> b
*>* is a substitution instance of
*>* HasFoo a b => a -> b
*>*
*>* but if we infer the type (HasFoo Int b => Int -> b)
*>* for f's RHS, we can then "improve" it using the instance
*>* decl to (HasFoo Int Bool => Int -> Bool), and now the signature
*>* isn't a substitution insance of the type of the RHS.
*
I definitely want it to be legal. I have examples where this is immensly useful.
--
-- Lennart