functional programming: domains and ranges

2021-09-22

 | 

~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.

Complete

Let’s look at some examples:

add
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:

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:

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

But what about:

addPartial
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.

Unique

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:

random
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, MathIsFun.com has a good write up on Domains, Ranges, and Codomains which is worth a look.


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!