Previous Up Next
6.4 Type expressions


typexpr ::= ' ident
  | _
  | ( typexpr )
  | [[?]label-name:]  typexpr ->  typexpr
  | typexpr  { * typexpr }+
  | typeconstr
  | typexpr  typeconstr
  | ( typexpr  { , typexpr } )  typeconstr
  | typexpr as '  ident
  | [ variant-type ]
  | < [..] >
  | < method-type  { ; method-type }  [; ..] >
  | # class-path
  | typexpr #  class-path
  | ( typexpr  { , typexpr } ) #  class-path
poly-typexpr ::= typexpr
  | { ' ident }+ .  typexpr
method-type ::= method-name :  poly-typexpr

下記のテーブルは、演算子の相対的な優先順位と結合方向、および閉じていない型構築を示しています。より高い優先順位の型構築が先に来ます。
演算子 結合方向
型構築子の適用 --
* --
->
as --

型式は、パターンや式における型制約と同じように、データの型の定義における型を示します。

Type variables

型式 ' ident は、identという名前の型変数を意味します。型式 _ は無名の型変数を意味します。データの型定義の場合、型変数はそのデータ型の引数のための名前になります。型制約の場合、型変数はその型制約を満たすあらゆる型になることのできる不特定の型を意味します。一般に名前のある型変数のスコープは、それを囲んだ定義全体となります。このスコープを離れたときに、型変数はまた一般的に使うことができます。無名の型変数にはこのような制約はありません。

Parenthesized types

型式 ( typexpr )typexpr と同じ型を示します。

Function types

型式 typexpr1 ->  typexpr2 は型 typexpr1 の引数を取り、型 typexpr2 を返す関数の型を示します。

label  typexpr1 ->  typexpr2 も同じ関数型を示しますが、その引数は label によってラベルづけされます。

?label  typexpr1 ->  typexpr2 はオプショナルなラベルつき引数 typexpr1 を受け取り型 typexpr2 を返す関数を示します。つまり、この関数の実際の型は typexpr1 option ->  typexpr2 となります。

Tuple types

型式 typexpr1 * ... *  typexprn は組(tuple)の型を示し、その組の要素はそれぞれ typexpr1, ...  typexprn です。

Constructed types

パラメータを持たない型コンストラクタは上では typeconstr と表記されていますが、これは型式です。

型式 typexpr  typeconstrtypeconstr ひとつのパラメータを与えられた型構築子であり、単項式の型構築子 typeconstr の型 typexpr への適用を示します。

型式 (typexpr1,..., typexprn)  typeconstrn 個のパラメータを与えられた型構築子であり、 n項式の型構築子 typeconstrtypexpr1 through typexprn への適用を示します。

Aliased and recursive types


型式 typexpr as '  ident は型 typexpr と同じ型を示し、なおかつtypexpr および残りの部分において型変数 identtypexpr に束縛します。 型変数 identtypexpr の中に実際に存在した場合には再帰的な型が生成されます。オブジェクトやバリアント型コンストラクタを含まない再帰パスが存在する再帰型は、 -rectypes モードが選択されていない限り棄却されます。

もし ' ident が明らかに多相型を示しており、 typexpr がオブジェクトまたはバリアント型を示していたならば、 typexpr の列変数は ' ident によって限定され量子化されます。

Variant types

variant-type ::= [ | ] tag-spec  { | tag-spec }
  | > [ tag-spec ]  { | tag-spec }
  | < [ | ] tag-spec-full  { | tag-spec-full }  [ > { `tag-name }+ ]
tag-spec ::= `tag-name  [ of typexpr ]
  | typexpr
tag-spec-full ::= `tag-name  [ of typexpr ]  { & typexpr }
  | typexpr

バリアント型は多相な変化によって取ることのできる値を記述します。

最初のケースは正確な(exact)バリアント型です。すべての可能なタグは関連した型とともに既知で、すべて存在しています。その構造は完全にわかります。

二番目のケースは開放された(open)バリアント型で、多相なバリアント値を記述します。これは取りうる全てのタグのリストを関連した型とともに与えます。この型は、より多くのタグを含むバリアント型と互換性を持ちます。特殊な場合が不明型で、そこには一切のタグがなく、あらゆるバリアント型と互換性を持ちます。

三番目のケースは閉じたバリアント型です。これは全ての可能なタグと関連した型の情報を与えます。このタグは値の中に現れる可能性があると考えられるものです。上記の正確なバリアント型は、すべての可能なタグが存在する可能性がある閉じたバリアント型の簡略表現に過ぎません。

これら3つのケース全てで、タグは `tag-name [...] の形式で直接指定されるか、型式によって間接的に表現されます。最後のケースでは、型式は正確なバリアント型を展開できなくてはなりません。そのタグ指定はその場所に展開されます。

バリアントタグの完全な指定は正確でない閉じた型でのみ利用されます。これは引数のための接続型として理解されます: 指定の差異に列挙された全ての型を取ることが期待されています。

このような接続の制約は満足されないかもしれません。その場合には対応するタグをこの型の値として利用することはできません。このことはその型全体が無効になるわけではありません。他の可能なタグを利用することもできます。

Object types

オブジェクト型 < method-type  { ; method-type } > はメソッド型のレコードです。

それぞれのメソッドは明示的に多相型: { ' ident }+ .  typexpr を持つかもしれません。明示的な多相変数はローカルなスコープを持ち、明示的な多相型は、同じ位置に多相変数を持つ等価な型に統合されます。

< method-type  { ; method-type } ; .. > は、method-type1, ...,  method-typen で示されたメソッドと関連付けられた型を持つオブジェクトの型です。他のメソッドが存在する可能性は省略記号で表現されています。この省略表現は実際には特殊な種類の型変数であり(列変数(row variable)と呼ばれます)、他の不特定数のメソッドを意味します。

#-types

# class-path は特殊な種類の簡略表現です。この簡略表現はクラス class-path のサブクラスに属するあらゆるオブジェクトの型を統合したものです。この型は、型変数(サブクラスに追加されているかもしれないメソッドを表現する省略記号)を隠すような特殊な場合に扱われます。特に、省略記号が具体化する場合にこの型は消滅します。個々の型表現 # class-path は新しい型変数を定義するので、型 # class-path -> #  class-path と型 (# class-path as '  ident) -> '  ident は通常の場合、同一ではありません。

バリアント型に対する#-型の利用は軽視されます。もし t が正確なバリアント型なら #t[< t] に翻訳され、 #t[> `tag1 ...`tagk][< t > `tag1 ...`tagk] に翻訳されます。

Variant and record types

バリアント型としてもレコード型としても記述(定義)されない型式は存在しません。なぜならこれらは常に名前付けされており、すなわち利用に先立って定義され名前によって参照されているからです。型定義はセクション 6.8.1 で説明されています。


Previous Up Next