| 8 | Haskell 98 provides only rank-1 types: universal quantification is over the whole type expressions, and is implicit, e.g. |

| 9 | {{{ |

| 10 | const :: a -> b -> a |

| 11 | }}} |

| 12 | Rank-2 types may have polymorphic arguments, marked by `forall`, e.g. |

| 13 | {{{ |

| 14 | plus :: (forall a. a -> a) -> (forall a. a -> a) -> b -> b |

| 15 | }}} |

| 16 | Rank-3 types may have arguments of rank-2 type, e.g. |

| 17 | {{{ |

| 18 | f3 :: ((forall a. a->a) -> Int) -> Bool -> Bool |

| 19 | }}} |

| 20 | and so on to arbitrary depth. |

| 21 | |

| 22 | `forall`s in the second argument of `->` could be permitted as a convenience, but they are equivalent to `forall`s further out. |

| 23 | `forall`s are not permitted inside arguments of other type constructors. |

| 24 | |

| 25 | The GHC User's Guide has some vague remarks about how type signature information is used. |

| 26 | Perhaps someone could elaborate. |

| 27 | |

9 | | * [http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#universal-quantification] GHC documentation. |

10 | | * [http://research.microsoft.com/Users/simonpj/papers/higher-rank/index.htm] Practical type inference for arbitrary-rank types |

| 29 | * [http://www.haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#universal-quantification Arbitrary-rank polymorphism] in the GHC User's Guide. |

| 30 | * [http://research.microsoft.com/Users/simonpj/papers/higher-rank/index.htm Practical type inference for arbitrary-rank types], Simon Peyton Jones, Dimitrios Vytiniotis, Stephanie Weirich and Mark Shields, July 2005. |

| 31 | * [wiki:Rank2Types] are a special case |