wiki:Rank2Types

Version 4 (modified by ross@…, 8 years ago) (diff)

--

Rank 2 Types

See ExtensionDescriptionHowto for information on how to write these extension descriptions. Please add any new extensions to the list of HaskellExtensions.

Brief Explanation

Functions may have polymorphic arguments, subject to three restrictions:

  • Such functions must have explicit type signatures, using forall to bind polymorphic type variables, e.g.
    g :: (forall a. a -> a) -> (Bool, Char)
    
  • In the definition of the function, polymorphic arguments must be matched on the left-hand side, and can only be matched by a variable or wildcard (_) pattern. The variable then has the polymorphic type of the corresponding argument, e.g.
    g f = (f True, f 'a')
    
  • When such a function is used, it must be applied to at least as many arguments to include the polymorphic ones (so it's a good idea to put those first). Each expression must have a generalized type at least as general as that declared for the corresponding argument, e.g.
    g id
    g undefined
    

The more general RankNTypes remove the last two restrictions.

References

PolymorphicComponents do the same thing for data constructors.

Pros

  • simple type inference
  • offered by GHC and Hugs for more than 15 years
  • enables runST and similar devices
  • used in cheap deforestation

Cons