
2009/11/12 Neil Brown
Eugene Kirpichov wrote:
2009/11/12 Andrew Coppin
: Even I am still not 100% sure how placing forall in different positions does different things. But usually it's not something I need to worry about. :-)
To me it does not look like it does different things: everywhere it denotes universal polymorphism. What do you mean? I might be missing something.
I think what he means is that this:
foo :: forall a b. (a -> a) -> b -> b
uses ScopedTypeVariables, and introduces the type-name a to be available in the where clause of myid. Whereas something like this:
foo2 :: (forall a. a -> a) -> b -> b
uses Rank2Types (I think?) to describe a function parameter that works for all types a. So although the general concept is the same, they use different Haskell extensions, and one is a significant extension to the type system while the other (ScopedTypeVariables) is just some more descriptive convenience.
But that's not an issue of semantics of forall, just of which part of the rather broad and universal semantics is captured by which language extensions.
Thanks,
Neil.
-- Eugene Kirpichov Web IR developer, market.yandex.ru