では、ここでの'aの意味は何ですか?
これは、関数(Javaではジェネリックとして知られています)のパラメトリックポリモーフィズムに似ていますが、型の場合です。このコードセットでは、intを格納するタイプint set
、文字列---string set
などがあります。'aは、一般的なOCaml構文であるため、前にあります。改訂された構文では、型変数は型名の後に記述されます:likelist int
またはset list int
。さまざまな種類のポリモーフィズムの詳細については、本Types at programming languages
、パートV:ポリモーフィズムをお勧めします。関数のパラメトリック多相を理解していれば、型の知識を高めることは難しくないと思います。
どのような詳細が隠されていますか?
MLファイルでは、タイプ'a set
は要素のリストとして定義されています。リスト内のいくつかの要素を検索するには、リストを反復処理して(=)
すべての要素を呼び出す必要があります(これが関数のList.mem
動作方法です)。OCamlのAFAIRでは、stdlibセットはバランスの取れたツリーとして実装され、セットに格納されている値は、セットに格納されている要素のタイプであるcompare: t -> t -> int
関数を持つ必要があります。t
ただし、セットは別の方法で定義でき、.mliの抽象型のみを見ると、.mlファイルでどのように実装されているかを推測することしかできません。
実際、この定義では、型は型'a list
を実装するために使用されてい'a set
ますが、インターフェイスファイルからは、この情報は表示されません。隠された部分は、set
型が実際にはであるという事実ですlist
。モジュールの実装方法、および外部に提供されている情報の選択により、プログラムは、そのset
作成方法を知らなくてもタイプを使用できます。
これは、開発者がモジュールを使用するコードを変更することなく、そのモジュールの実装を変更できるようにするため、ソフトウェア設計の重要な機能です。型を抽象化すると、その分離が強制されます。モジュールの外部list
としてを使用しようとすると、型エラーが発生します。set
タイプ'セット='リスト
AFAIR、この行は「タイプシノニム」(またはエイリアス)を導入しています。こことその下のタイプset
はと同じであり、期待する関数でlist
使用でき、その逆も可能です。set
list
あなたが見るとき、あなたは'a set
それがただの何かのセットであることを理解するべきです、あなたがセットに置くとき、string
それはになりますstring set
。'a set
表示されている場合は、このセットに何が格納されているか、または格納されるかはわかりませんが、表示されている場合は表示されstring set
ます。タイプの同義語は、上記の本にも記載されています。
PS
つまり、タイプ'a set ='を意味します。リストは、セットがパラメーターとしてリストを期待していることを示しますか?
いいえ、そうではありません。この行に新しいタイプのエイリアスを追加するだけです。'型変数に置き換えることができる型の数を縮小しません。あなたが書くなら
# type 'a set = 'a list;;
type 'a set = 'a list
# let create x : _ set = [x];;
val create : 'a -> 'a set = <fun>
その後
List.map ((+)1) (create 2);;
コンパイラは、の型を(の型のパラメータに値が使用され、その関数の戻り型はであるため)create 2
として推論し、型エイリアス(同義語)のテーブルを調べて、いつ理解するかを判断します。その型は型と同じであり、型推論のプロセスを続行します。int set
int
'a
create
'a set
set
list
新しいシノニムを作成するときは、正しい数の型変数を記述する必要があることを理解する必要があります。つまりtype 'a new_t = ('a*'b) list
、私とコンパイラの両方にとって意味がありません。少なくとも左側には右側と同じ数の型変数が必要 type ('a, 'b) new_t = ('a * 'b) list
です。たとえば、動作します。