列挙データ型

最も簡単なデータ型は有限個の定数を列挙したものです。 例えば、次の具体的な構文は wday という名前のデータ型を導入します:

datatype wday = | Monday of () | Tuesday of () | Wednesday of () | Thursday of () | Friday of () | Saturday of () | Sunday of () // end of [wday]

ここで最初の記号 (|) は省略できます。 7つの引数のないコンストラクタがデータ宣言によって作られています: つまり wday 型の値をコンストラクトする Monday から Sunday です。 例えば Monday()wday 型の値です。 引数のないコンストラクタ C が与えられた時、 C() と書くと値になります。 例えば MondayMonday() と書くことができます。 けれども TuesdayMonday+1 のような何かであると考えるべきではありません

次のコードでは、与えられた wday 型の値が平日かどうか検査する関数を実装しています:

fun isWeekday (x: wday): bool = case x of | Monday() => true // the first bar (|) is optional | Tuesday() => true | Wednesday() => true | Thursday() => true | Friday() => true | Saturday() => false | Sunday() => false // end of [isWeekday]

引数のないコンストラクタ C が与えられた時、C() パターンは値 C() にのみマッチします。 パターンとして使う時、C() を C のように書くことができないことに注意してください。 もし isWeekday 関数の中で Monday()Monday のように書くと、 最初の節以降の全ての節が余分であることを示すエラーメッセージが型検査時に出ます。 これは単に Monday が変数パターンとして解釈されたためで、 このパターンはどのような値にもマッチするからです。 isWeekday のよりよい実装は次のようなものでしょう:

fun isWeekday (x: wday): bool = case x of | Saturday() => false | Sunday() => false | _ => true // end of [isWeekday]

パターンマッチは実行時に順番に処理されるので、この実装はうまく動きます: wday 型の値が Saturday() にも Sunday() にもマッチしなければ、 その値は Monday() , Tuesday() , Wednesday() , Thursday() , Friday() のどれが1つにマッチするはずです。