[Haskell-cafe] Re: Aren't type system extensions fun?
Gleb Alexeyev
gleb.alexeev at gmail.com
Tue May 27 03:58:04 EDT 2008
Andrew Coppin wrote:
> What a perplexing example! :-}
For a bit less mind-boggling example, try meditating about the next two
functions. It may be instructive to comment out type signatures and see
what happens.
{-# OPTIONS -fglasgow-exts #-}
foo :: (forall a . a -> a) -> (Bool, String)
foo g = (g True, g "bzzt")
bar :: (forall a . Num a => a) -> (Integer, Float)
bar x = (x `div` 3, x / 3)
In a nutshell, rank-N typing is simple. Rank-1 polymorphism allows us to
type functions like map, foldr etc we all know and love. Rank-1
polymorphic types contain type variables that may be instantiated with
any monomorphic type (e.g., Int, String, etc). Rank-2 polymorphic
functions accept rank-1 polymorphic values as argument. Rank-N
polymorphic functions accept rank-(N-1) polymorphic values as argument.
As a practical example of the need for higher-rank polymorphism you may
want to read about ST monad.
More information about the Haskell-Cafe
mailing list