| r[type.enum] |
| # Enumerated types |
| |
| r[type.enum.intro] |
| An *enumerated type* is a nominal, heterogeneous disjoint union type, denoted |
| by the name of an [`enum` item]. [^enumtype] |
| |
| r[type.enum.declaration] |
| An [`enum` item] declares both the type and a number of *variants*, each of |
| which is independently named and has the syntax of a struct, tuple struct or |
| unit-like struct. |
| |
| r[type.enum.constructor] |
| New instances of an `enum` can be constructed with a [struct expression]. |
| |
| r[type.enum.value] |
| Any `enum` value consumes as much memory as the largest variant for its |
| corresponding `enum` type, as well as the size needed to store a discriminant. |
| |
| r[type.enum.name] |
| Enum types cannot be denoted *structurally* as types, but must be denoted by |
| named reference to an [`enum` item]. |
| |
| [^enumtype]: The `enum` type is analogous to a `data` constructor declaration in |
| Haskell, or a *pick ADT* in Limbo. |
| |
| [`enum` item]: ../items/enumerations.md |
| [struct expression]: ../expressions/struct-expr.md |