The simplest form of datatypes is for enumerating a finite number of
constants. For instance, the following concrete syntax introduces a
datatype of the name wday:
where the first bar symbol (|) is optional. There are 7 nullary
constructors introduced in the datatype declaration:
Monday
through
Sunday, which are for constructing values of the type
wday. For instance,
Monday() is a value of the type
wday. Given a nullary constructor C, we can write C for C() as
a value. For instance, we can write
Monday for
Monday(). However, one should
not assume
that
Tuesday is something like
Monday+1.
The following code implements a function that tests whether a given value
of the type wday is a weekday or not:
Given a unary constructor C, C() is a pattern that can only match the value
C(). Note that C()
cannot be written as C when it is
used as a pattern. If
Monday() is written as
Monday in
the body of the function
isWeekday, then an error message is to be
reported during typechecking, indicating that all the clauses after the
first one are redundant. This is simply due to
Monday being
treated as a variable pattern, which is matched by any value. A likely more
sensible implementation of
isWeekday is given as follows:
This implementation works because pattern-matching is done sequentially at
run-time: If a value of the type
wday does not match either of
Saturday() and
Sunday(), then it must match one of
Monday() ,
Tuesday() ,
Wednesday() ,
Thursday(), and
Friday().