In this case, I think they meant <i>algebraic data type</i>, since they mention it next to &quot;pattern matching&quot;.<p>An algebraic data type is generally made up of two things: 1) structs or tuples, which are useful but in most (but not all languages); C&#x2F;C++ has them for example; and 2) tagged or disjoint unions, which are different from C unions in that you can tell which one of the union choices is being used (A variant is a particular tagged union).<p>Tagged unions are super-useful for pattern matching, so you get code like:<p><pre><code>    match rv {
        Ok(_) =&gt; {
            None
        }
        Err(CacheError::KeyNotFound) =&gt; {
            Some(Resp::NotFound)
        }
        Err(ref err) =&gt; Some(from_cache_err(err))
    }
</code></pre>
which has a nice syntax, is type-safe and can be compiled reasonably efficiently.<p>The algebraic part means that these two features can be used in any combination with each other, and also refers to the link that, roughly 0 is the empty type, 1 is the unit type, structs correspond to multiplies (and gets called the product type), and unions to plus (so is called a sum type).<p>Why? Because if I have a tuple of a union of A or B or C, and another union of X or Y, I have 6 possible values in total, and (1+1+1) x (1+1) = 6.