Pair types

Pair types, or product types, represent ordered pairs of values. Suppose A and B are types. Then:

  • A * B (also written A × B) is a pair type (also known as a product type or Cartesian product). It represents the set of all possible pairs where the first element has type A and the second element has type B.

  • A pair is written (a, b) (where a and b can be arbitrary expressions). Specifically, if a : A and b : B, then the ordered pair (a, b) has type A * B. For example:

    Disco> :type (1, True)
    (1, true) : ℕ × Bool
    Disco> :type (-7, -3)
    (-7, -3) : ℤ × ℤ
    

Pair types are commonly used to represent functions that take multiple inputs. For example, f : N * Z -> Q means that f takes a pair of a natural number and an integer as input. Such functions are often defined via pattern matching on the pair, like so:

f : N * Z -> Z
f(n,z) = 3n - z

n-tuples and nested pairs

We have seen that A * B is a type of pairs of values. What about triples, quadruples, … n-tuples of values? The answer is simple:

  • triples are written (x,y,z) and have types like A * B * C;
  • quadruples are written (w,x,y,z) and have types like A * B * C * D;
  • and so on.

So, for example, a function taking a quintuple of values could be written like this:

funTaking5Tuple : N * Z * List(N) * Q * Bool -> Int
funTaking5Tuple(n,z,l,q,b) = ...

Note

General n-tuples actually are not specially built in at all: rather, everything is actually built out of nested pairs. For convenience, pair types and values both associate to the right, that is,

  • the type A * B * C is interpreted as A * (B * C), and
  • correspondingly, (x, y, z) is interpreted as (x, (y, z)).

So, for example, the definition of the function funTaking5Tuple from above is really shorthand for

funTaking5Tuple : N * (Z * (List(N) * (Q * Bool))) -> Int
funTaking5Tuple(n,(z,(l,(q,b)))) = ...

Typically one can just use triples or 5-tuples or whatever and not think about this, but occasionally it’s helpful to understand the way things are represented with nested pairs under the hood.