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) |