Archive of

Sum and Product Types

In this post we will discuss sum and product types. Consider the struct X, defined as

struct X {
    A a;
    B b;
};

Here, A and B are also types, but it does not matter what their declarations are. What kind of values can an instance of type X take on? To instantiate an object of type X, we need to supply an instance of type A and an instance of type B. If the total number of different values that A can take on is denoted by \(|A|\), and the total number of different values that B can take on is denoted by \(|B|\), then the total number of values that X can take on is \(|X| = |A| \cdot |B|\).

Consider Y defined as

using Y = std::variant<A, B>;

What kind of values can an instance of type Y take on? To instantiate an object of type Y, we need to supply an instance of type A or an instance of type B. If the total number of different values that A can take on is denoted by \(|A|\), and the total number of different values that B can take on is denoted by \(|B|\), then the total number of values that Y can take on is \(|Y| = |A| + |B|\).

Because the total number of different values that X can take on is a product of its fields, we call X a product type. In contrast, we call Y a sum type, because it can only take on as many values as the sum of its constituent types.