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

19.25 動的型キャスト付き場合分け式 _dynamiccase exp of match

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

  pat1 => exp1
|
|
patn => expn

各パターンの型はそれぞれ異なっていても良い. ただし,各パターンに現れる 識別子パターンのうち変数のパターンおよび匿名パターンにはすべて 型注釈が付けられていなければならない. また,これらパターン集合は以下の制約を満たさなければならない.

  • 指定されたパターンをその型で分類したとき,各型のパターンの並び についてcase式と同様の制約を満たさなければならない.

例えば以下の例はintについて冗長なためエラーとなる.

# fn x => _dynamiccase x of x:int => "int" | x:real => "real" | 0:int => "zero";
(interactive):1.8-1.76 Error: match redundant
      x => ...
  --> 0 => ...

この場合分け式の評価は以下のように行われる. expを評価し得られた動的型付けされた値vを, pat1からpatnのパターンに対して, この順にマッチングを試みる. マッチングの際,_dynamic式と同様の方法で,vを パターンの型に動的型キャストする. キャストとマッチングの両方に成功した最初のパターン patiに含まれる変数を対応する値に束縛し, その束縛を現在の環境追加して得られる環境で, patiに対応する式expiを評価し, 得られる値を,この式の値とする. 動的型キャストに成功する型を持つパターンが存在しないときは Dynamic.RuntimeTypeError例外が発生する. マッチするパターンが無い場合はMatch例外が発生する.

この式を分割コンパイルモードで用いる場合, "reify.smi"_requireする必要がある.