#
# Polymorphism
##
# Higher Kinded Types
# Higher Ranked Polymorphism
All types are implicitly qualified. A good explanation for this lives here. In haskell syntax:
-- this is implicitly adding a universal qualifier
f :: a -> a -> b
-- the qualifier:
f :: forall a b. a -> a -> b
Higher ranked polymorphism is simply allowing us to accept arguments and return polymorphic functions. For example, rank 2 polymorphism allows us to return functions containing a forall.
f :: (forall a. a) -> (forall b. b)
The level of nested qualification determines the “ranked”-ness of the polymorphism. For example, the following function would be of rank 3:
f :: (Int -> (forall a. a)) -> Int
TODO transformers/why this is useful