Parametric polymorphism is the ability to write a single piece of code that operates uniformly on values of any type, by treating the type itself as a parameter. A function that reverses a list, for example, does not care whether the list holds integers, strings, or other lists; it works the same way for every element type. Modern languages expose this through generics.
The formal theory comes from John Reynolds’s 1974 paper “Towards a Theory of Type Structure,” which set out a precise account of polymorphic type structure and later grounded the idea of relational parametricity, a mathematical model of what it means for code to behave uniformly across types. Reynolds’s formulation, together with Jean-Yves Girard’s independent work, is the system now usually called System F or the polymorphic lambda calculus.
The Stanford Encyclopedia entry on type theory treats polymorphic and dependent type systems as part of the same family that classifies terms by type. Parametric polymorphism is the specific case where a type variable ranges over all types, so a single definition is shared rather than copied for each concrete type.
This single idea flows through much of modern programming. The generics of ML and Haskell are direct descendants, and the generics later added to Java and C# bring the same uniformity to mainstream object-oriented languages.