6.4 Type expressions

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2008-11-29 (土) 13:45:48
              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という名前の型変数を意味します。型式 _ は無名の型変数を意味します。データの型定義の場合、型変数はそのデータ型の引数のための名前になります。型制約の場合、型変数はその型制約を満たすあらゆる型になることのできる不特定の型を意味します。一般に名前のある型変数のスコープは、それを囲んだ定義全体となります。このスコープを離れたときに、型変数はまた一般的に使うことができます。無名の型変数にはこのような制約はありません。 (以下FIXME)次の場合、型変数は束縛されます: 1) 全称(陽に多相な(FIXME:explicitly polymorphic)) 型変数; 2) パブリックなメソッド仕様にのみ現れる型変数 (仕様 6.9.1 に書かれているように,全称になる型変数) (FIXME:どういう意味?) 3) 別名が指している型で使われている型変数で,それを囲んだ定義において不正となるようなもの (つまり,それが自由な型変数や,ローカルに定義された型を含む場合)。

(FIXME以下の原文) In the following cases, the scope of named type variables is restricted to the type expression where they appear: 1) for universal (explicitly polymorphic) type variables; 2) for type variables that only appear in public method specifications (as those variables will be made universal, as described in section 6.9.1); 3) for variables used as aliases, when the type they are aliased to would be invalid in the scope of the enclosing definition (i.e. when it contains free universal type variables, or locally defined types.)

Parenthesized types

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

Function types

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

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

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

Tuple types

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

Constructed types

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

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

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

Aliased and recursive types

型式 typexpr as ' ident は型 typexpr と同じ型を示し、なおかつtypexpr および残りの部分において型変数 ident を typexpr に束縛します。 一般に別名のスコープは名前付きの型変数と同じで,それを囲む定義全体を含みます. 型変数 ident が typexpr の中に実際に存在した場合には再帰的な型が生成されます。オブジェクトやバリアント型コンストラクタを含まない再帰パスが存在する再帰型は、 -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[> `tag_1 ...`tag_k] は [< t > `tag_1 ...`tag_k] に翻訳されます。

Variant and record types

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

新規 編集 添付