Concept:
Nominal typing
Headline
Equivalence of types based on their names
Illustration
See structural typing for illustration.
Concept:
Structural typing
Headline
Equivalence of types based on their structure
Illustration
Consider the following declarations in Language:Haskell:
type Point = (Float, Float) -- A Cartesian point
type Rectangle = (Float, Float) -- A rectangle with width and height
Because both types are defined as type synonyms, they are subject to structural typing. Thus, points and rectangles are compatible such that a point can be used whereever a rectangle is expected, and vice versa. This is arguably not intended. We may instead define the types as follows:
data Point = Point Float Float -- A Cartesian point
data Rectangle = Rectangle Float Float -- A rectangle with width and height
While both types are structurally equivalent, as both types declare one data constructor with the exact same types for the constructor components, the types are still different as nominal typing applies for Haskell's algebraic data types.