Greg Buchholz wrote:
I'm not quite sure why this is illegal...
foo :: Integer -> (forall a. Show a => a)
foo 2 = ["foo"]
foo x = x
...while this is just fine...
bar :: Integer -> (forall a. Show a => a->b) -> b
bar 2 k = k ["bar"]
bar x k = k x
The way to think about it is that foralls are extra function arguments. Your
first example is like
foo :: Integer -> (a::Type -> Show a -> a)
so a is chosen by the caller, not by you. The second case is like
bar :: Integer -> (a::Type -> Show a -> a -> b) -> b
In order for the first case to work as you expect, you'd need the type
foo :: Integer -> (a::Type, Show a, a)
which is traditionally written
foo :: Integer -> (exists a. Show a => a)
-- Ben
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe