An enum with two choices is different from a boolean

Last edited April 2021

While an enum with two choices might be encoded as a boolean, the semantics differ, and they need to be used in a different way.

Consider a Target enum:

enum Target {
  staging,
  production,
}

This could be encoded as a boolean (false is staging, true is production), but this limits extensibility.

Consider a function that returns the other target:

fun otherTarget(t: Target): Target

Adding a third option for target would break this function. It would be better to write it to return an array:

fun otherTargets(t: Target): [Target]

If there are only two options for Target, this would be a little strange: it would only ever return an array with one element in it. However, adding a third Target is now easy.

Option types and lists

There is an interesting parallel between option types and lists. Consider an otherTarget function that could return a target or nothing:

fun otherTarget(t: Target): Option<Target>

The analogue for the otherTargets function (returning a list) is that this function could return a list of one element (if there is a target) or an empty list (if there is no target).

See also Minimal language with arrays in Ruby, where false and true are encoded as an empty and a non-empty list, respectively.