19.25 動的型キャスト付き場合分け式 _dynamiccase exp of match
expの評価結果の動的型付けされた値を 動的型と値の構造に関する場合分けで処理する構文である. matchでは,データ構成子を含むパターンとそのパターンにマッチし た時に評価される式の組を以下の形で記述する.
pat => exp
|
| pat => exp
各パターンの型はそれぞれ異なっていても良い. ただし,各パターンに現れる 識別子パターンのうち変数のパターンおよび匿名パターンにはすべて 型注釈が付けられていなければならない. また,これらパターン集合は以下の制約を満たさなければならない.
-
•
指定されたパターンをその型で分類したとき,各型のパターンの並び について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を評価し得られた動的型付けされた値を, patからpatのパターンに対して, この順にマッチングを試みる. マッチングの際,_dynamic式と同様の方法で,を パターンの型に動的型キャストする. キャストとマッチングの両方に成功した最初のパターン patに含まれる変数を対応する値に束縛し, その束縛を現在の環境追加して得られる環境で, patに対応する式expを評価し, 得られる値を,この式の値とする. 動的型キャストに成功する型を持つパターンが存在しないときは Dynamic.RuntimeTypeError例外が発生する. マッチするパターンが無い場合はMatch例外が発生する.
この式を分割コンパイルモードで用いる場合, "reify.smi"を_requireする必要がある.