プログラミング言語SML#解説 3.7.1版
19 式

19.18 場合分け式 case ⟨exp⟩ of ⟨match⟩

⟨exp⟩の評価結果の値を場合分けで処理する構文である. ⟨match⟩では,データ構成子を含むパターンとそのパターンにマッチし た時評価される式の組を以下の形で記述する.

  ⟨pat1⟩ => ⟨exp1⟩
| ⋯
| ⟨
patn⟩ => ⟨expn⟩

各パターン⟨pati⟩は,第20章で定義するデータ 構成子と変数からなるデータパターンである. これらパターン集合は以下の制約を満たさなければならない.

  • •

    同一のパターンに含まれる現れる変数はすべて異なる.

  • •

    パターンはすべて⟨exp⟩の型と同じ型を持つ.

  • •

    2≤i≤nなるすべてのiについて, パターン⟨pati⟩が冗長であってはならない. すなわち⟨pati⟩がカバーするデータの集合が, パターン⟨pat1⟩から⟨pati-1⟩がカバーする集合の 和に完全に含まれてはならない.

例えば以下の例は3番目の条件に違反している.

# fn x => case x of (X, 1, 2) => 1 | (1, X, 2) => 2 | (1, 1, 2) => 3;
(interactive):6.8-6.65 Error: match redundant and nonexhaustive
      (X, 1, 2) => ...
      (1, X, 2) => ...
  --> (1, 1, 2) => ...

この制約のもとで,この式全体は各式⟨expi⟩の型と同じ型 を持つ.

この場合分け式の評価は以下のように行われる. ⟨exp⟩を評価し得られた値を,⟨pat1⟩から ⟨patn⟩のパターンに対して,この順にマッチングを試み, 最初にマッチしたパターン⟨pati⟩に含まれる変数を対応する値に束 縛し,その束縛を現在の環境追加して得られる環境で,⟨pati⟩に対 応する式⟨expi⟩を評価し,得られる値を,この式の値とする. マッチするパターンが無い場合はMatch例外を発生させる.