### Variants

[
  Datatype variants
  Funcon   variant
  Funcon   variant-id
  Funcon   variant-value
]


Meta-variables
  T <: values


Datatype
  variants(T) ::= variant(_:identifiers, _:T)
/*
  A value of type `variants(T)` is a pair formed from an identifier and 
  a value of type `T`.
*/


Funcon
  variant-id(_:variants(T)) : =>identifiers
Rule
  variant-id(variant(I:identifiers, _:T)) ~> I


Funcon
  variant-value(_:variants(T)) : =>T
Rule
  variant-value(variant(_:identifiers, V:T)) ~> V