19.18 場合分け式 case exp of match
expの評価結果の値を場合分けで処理する構文である. matchでは,データ構成子を含むパターンとそのパターンにマッチし た時評価される式の組を以下の形で記述する.
pat => exp
|
| pat => exp
各パターンpatは,第20章で定義するデータ 構成子と変数からなるデータパターンである. これらパターン集合は以下の制約を満たさなければならない.
-
•
同一のパターンに含まれる現れる変数はすべて異なる.
-
•
パターンはすべてexpの型と同じ型を持つ.
-
•
なるすべてのについて, パターンpatが冗長であってはならない. すなわちpatがカバーするデータの集合が, パターンpatからpatがカバーする集合の 和に完全に含まれてはならない.
例えば以下の例は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) => ...
この制約のもとで,この式全体は各式expの型と同じ型 を持つ.
この場合分け式の評価は以下のように行われる. expを評価し得られた値を,patから patのパターンに対して,この順にマッチングを試み, 最初にマッチしたパターンpatに含まれる変数を対応する値に束 縛し,その束縛を現在の環境追加して得られる環境で,patに対 応する式expを評価し,得られる値を,この式の値とする. マッチするパターンが無い場合はMatch例外を発生させる.