Problem with functional dependencies
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.