プログラミング言語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宣言に応じて unitcontag,または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)