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

19.18 場合分け式 case exp of match

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

  pat1 => exp1
|
|
patn => expn

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

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

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

  • 2inなるすべての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例外を発生させる.