functional programming: domains and ranges



~2 min read


359 words

The domain of a function is the set of inputs for which a function is defined.

The range of a function is the set of values that are mapped to the function’s domain.

Total functions have a few attributes related to domains and ranges:

  1. For every value in the domain, there’s a value in the range.
  2. For every value in the domain, there is a unique match in the range.


Let’s look at some examples:

const add = (x: number, y: number): number => x + y

The add function’s domain is all numbers and that maps to a range which includes all numbers.

This variation of add is total.

On the other hand, we could have addSome:

const addSome = (x: 1 | 2 | 3, y: 1 | 2 | 3): 2 | 3 | 4 | 5 | 6 => x + y

This is also a total function. Every member of the domain maps to a value in the range. It could also be written as:

const addSome = (x: 1 | 2 | 3, y: 1 | 2 | 3): number => x + y

But what about:

const addSome = (x: number, y: number): number => {
  if (1 <= x && x <= 3) {
    return x + y

This is partial because the domain is any number, but there are values within the domain for which there’s no return value.


The other attribute of a total function is that the domain maps to a unique value in the range.

This means that every time you use a set of inputs, you get the same output.

In other words, this won’t qualify as a function:

const random = (x: number): number => (Math.random() ? 1 : 2)

Wrap Up

This is not meant to be an exhaustive review of domains, ranges, and set theory, but a primer. Hopefully it helps clarify some ideas!

If you’d like more, has a good write up on Domains, Ranges, and Codomains which is worth a look.

Related Posts
  • Functional Programming Notes

  • Hi there and thanks for reading! My name's Stephen. I live in Chicago with my wife, Kate, and dog, Finn. Want more? See about and get in touch!