プログラミング言語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する必要がある.