プログラミング言語SML#解説 3.7.1版
23 核言語の宣言とインターフェイス

23.3 datatype宣言 : ⟨datatypeDecl⟩

datatype宣言は,新しい型構成子を定義する. その構文は以下の通りである.

⟨datatypeDecl⟩ ::= datatype ⟨datbind⟩ (withtype ⟨tybind⟩)?
⟨datbind⟩ ::= (⟨tyvarSeq⟩)? ⟨tycon⟩ = ⟨conbind⟩ (and ⟨datbind⟩)?
⟨conbind⟩ ::= (op)? ⟨vid⟩ (of ⟨ty⟩)? (| ⟨conbind⟩)?
⟨tybind⟩ ::= ⟨tyvarSeq⟩ ⟨tycon⟩ = ⟨ty⟩ (and ⟨tybind⟩)?

型構成子名⟨tycon⟩はすべてて異なっていなければならず, 同一の⟨datbind⟩の中は,データ構成子名⟨vid⟩はすべて異なっ ていなければならない. この宣言により,型変数(⟨tyvarSeq⟩)?をパラメタと する相互再帰的な多相型型構成子⟨tycon⟩と,データ構成子⟨vid⟩ が定義される. ⟨tycon⟩のスコープは,⟨datatypeDecl⟩全体と,この宣言に続く 宣言である. withtypeは,⟨datatypeDecl⟩をスコープとする型の別名 定義であり,評価前に展開される.

23.3.1 datatype宣言インタフェース

datatype宣言に対するインタフェイスには,datatype仕様と 抽象型仕様がある. datatype仕様は,datatype宣言と同一である. 抽象型仕様の構文は以下の通りである.

⟨opequeTypeSpec⟩ ::= type (⟨tyvarSeq⟩)? ⟨tycon⟩ ( = ⟨runtimeTypeSpec⟩ )
⟨runtimeTypeSpec⟩ := unit  | contag  | boxed

datatype宣言に対してdatatype宣言インターフェイスを記述すると, _requireを通じて参照するコンパイル単位に対して, datatype宣言された型構成子とデータ構成子が定義される. datatype宣言に対して抽象型インタフェイスを記述すると,同一名前の 抽象型構成子が定義される. 抽象型インタフェイスのオペランドは,その型の実行時表現をコンパイ ラに通知するための注釈であり,datatype宣言に応じて unit,contag,またはboxedのいずれかを記述する. unitおよびcontagは, datatypeの実行時表現が構成子タグのみであるを意味する. datatype宣言に引数を持つデータ構成子が無い場合に記述する. 構成子が1つだけのときunitを, そうでないときcontagを書く. boxedは,datatypeの実行時表現がポインタであることを意味する. datatype宣言に引数を持つデータ構成子がある場合に記述する.

23.3.2 datatype宣言とインタフェイスの例

以下は,datatype宣言を含むソースファイルとインターフェイスの例である.

Data.sml file: datatype ’a list = nil | :: of ’a * ’a list
datatype ’a queue = QUEUE of ’a list * ’a list
Data.smi file: datatype ’a list = nil | :: of ’a * ’a list
type ’a queue (= boxed)