- 以下の宣言を考える.
type number=int
type transformer<e>=e->e
number は,整数 int と同等であり,
transformer<int> は, int->int を意味する.これらの型の定義
は,使用目的に合わせて,自由に置換することができる.これを
型の構造的同等性という.
- これら型コンストラクタの内部的な表現は,以下のようになる.
- Poly-Tiger では,ページ 513 のTiger 言語でのレコード区別
規則を保存したい.各レコード型宣言は「新しい型」を生成する.
これは occurrence equivalence of type という1.
- 以下のように定義できる.
type pair<a>={first:a,second:a}
type twosome<a>={first:a,second:a}
型 pair<int> と twosome<int> は同じではない.
- 構造的同等(structural equivalence) と occurrence equivalence
は,言語設計者の判断である.ML でのレコード型は,例えば,構造的同等を
使う.
- 一般的な Tiger では, Record 型は,フィールド unique
という unit ref により区別される.
- しかし,多相言語では,それらを引数として適用する場合に,
レコードのディスクリプションをコピーする必要がある.以下のようである.
let type pair<z>={first:z,second:z}
function f(a:pair<int>):pair<int>=a
in f
end
- 最初の行では新しい(型ではなく)型コンストラクタ pair を生成
している.パラメータの型としての pair<int> と,結果の型としての
pair<int> を同じにしたい.しかし pair<string> は異なった型
としたい.
- pair 型コンストラクタの内部を表現するために以下のように書
くことができる.
しかし,これで pair と twosome を区別しなければならない.
- そこで Unique
によりラッピングしよう.
タグ
と
で pair 型と twosome 型を区別
する.