Datatype generic programming
GHC Generics provide a nice interface for datatype generic programming. The core idea is that every datatype is representable as a sum of products. The
GHC.Generics module defines a small sufficient set of datatypes. The
unit type represents constructors with no arguments:
data U1 p = U1 -- unit
V1 datatype, on the other hand, represents types with no constructors (
data V1 p -- empty
Sums and products are represented respectively by the following types:
(:+:) f g p = L1 (f p) | R1 (g p) -- sum (:*:) f g p = f p :*: g p -- product
The sum types with more than two constructors are represented by the recursive application of (
:+:), and it's a similar case for the product types.
K1 datatype acts as a container ...