型族


Type_family

は、コンピュータサイエンスにおけるデータ型の関連付けについてです。組版用語については、書体を参照してください
。生物学用語については、タイプ(生物学)を参照してください でコンピュータサイエンス、型族関連付けデータタイプ他とのデータ型タイプレベルの使用、機能入力の種類と対応する出力タイプの有効なインスタンスのオープンエンドコレクションによって定義されています。
型族は、型間の部分関数をパターンマッチングによって定義できるようにするいくつかの型システムの機能です。これは、データとは対照的である型コンストラクタ定義、単射特にすべてのタイプの関数種類のタイプの新たなセットに、そして型シノニム(別名のtypedefの別の既存のセットに特定の種類のすべてのタイプの関数を定義します)単一のケースを使用してタイプします。
型族と型クラスは密接に関連しています。通常の型クラスは、入力型のパターンマッチングによって型から名前付き値のコレクションへの部分関数を定義し、型族は入力型のパターンマッチングによって型から型への部分関数を定義します。実際、型族の多くの用途には、各インスタンスに関連付けられた値と型の両方を論理的に含む単一の型クラスが型クラス内で宣言された型族は、関連型と呼ばれます。
型族または同様の機能をサポートするプログラミング言語には、Haskell(共通言語拡張機能付き)、 Standard ML(モジュールシステム経由)、 Scala(「抽象型」という名前で)、およびC ++(テンプレートでtypedefを使用する)。

コンテンツ
1 バリエーション
2 動機と例
2.1 自己最適化抽象データ型 2.2 コレクションのクラス
3 機能従属性との比較
4 参考文献
5 外部リンク

バリエーション
Glasgow HaskellコンパイラのTypeFamilies拡張機能は、タイプシノニムファミリとデータファミリの両方をサポートします。型同義語ファミリは、より柔軟な(ただし、型チェックが難しい)形式であり、型関数の終域内の型を、適切な種類の任意の型にすることができます。一方、データファミリーは、各インスタンスに関数の結果の新しい型コンストラクターを定義するように要求することにより、終域を制限します。これにより、関数が単射であることが保証され、クライアントのコンテキストが型族を分解して元の引数型を取得できるようになります。

動機と例
型族は、型の一般的な「組織」または「構造」が繰り返されるパターンを抽象化するのに役立ちますが、それぞれの場合に異なる特定の型が典型的なユースケースには、ジェネリックコレクションのような抽象データ型の記述や、model-view-controllerのようなデザインパターンの記述が含まれます。

自己最適化抽象データ型
関連する型を導入する当初の動機の1つは、抽象型を実装するデータ構造が「自己最適化」方法で変化するように、抽象データ型をコンテンツ型によってパラメーター化できるようにすることでした。通常の代数的データ型パラメーターは、すべての引数型に関して均一に動作するデータ構造のみを記述できます。ただし、関連付けられたタイプは、統一されたインターフェイスを持つが、1つ以上のタイプパラメーターに応じて実装が異なるデータ構造のファミリーを記述できます。たとえば、 Haskellの関連する型表記を使用して、有効な配列要素型の型クラスを宣言できます。関連するデータ型は、その要素型の配列を表します。
クラス ArrayElem 電子 データアレイのEインデックス::アレイE – >のInt – > E
次に、このクラスのインスタンスを定義できます。インスタンスは、使用されるデータ構造とデータ構造の操作の両方を単一の場所で定義します。効率を上げるために、ブール値の配列にはパックビットベクトル表現を使用し、整数値には通常の配列データ構造を使用する場合が順序対の配列のデータ構造は、各要素タイプの配列のペアとして再帰的に定義されます。
instance ArrayElem Bool where data Array Bool = BoolArray BitVector index (BoolArray ar ) i = indexBitVector ar i instance ArrayElem Int where data Array Int = IntArray UIntArr index (IntArray ar ) i = indexUIntArr ar i instance (ArrayElem a 、 ArrayElem b ) => ArrayElem (a 、 b ) ここで、 data Array (a 、 b ) = PairArray (Array a ) (Array b ) index (PairArray ar br ) = (index ar i 、 index br i )
これらの定義では、クライアントがを参照するとArray (Int, Bool)、定義されたインスタンスを使用して実装が自動的に選択されます。

コレクションのクラス
前の例を逆にすると、型族を使用してコレクション型のクラスを定義することもできます。ここで、type関数は、各コレクション型を対応する要素型にマップします。
class Collects c where type Elem c empty :: c insert :: Elem c- > c- > c toList :: c- > instance Collects where type Elem = e empty = [] insert = (:) ToListメソッド = IDのインスタンス オード E => 収集し (セット。セット E ) 型Elemの(セット。セットEは)= E空=セット。空の挿入=設定。toList = Setを挿入します。toList
この例では、複数のコレクションタイプが同じ要素タイプを持っている可能性があるため、データファミリーの代わりにタイプシノニムファミリーを使用することが不可欠です。

機能従属性との比較
関数従属性は、関連する型と同様の用途を持つ別の型システム機能です。関連付けられた型が、囲んでいる型クラスのパラメーターを別の型にマッピングする名前付き型関数を追加する一方で、関数従属性は、結果型を型クラスの別のパラメーターとしてリストし、型パラメーター間に制約を追加します(たとえば、「パラメーターaはパラメーターbを一意に決定します」”、書かれていますa -> b)。関数従属性の最も一般的な使用法は、関連するタイプに直接変換でき、その逆も可能です。
型族は、一般的に関数従属性よりも型チェックが容易であると見なされています。関数従属性に対する関連型のもう1つの利点は、後者では、型クラスを使用するクライアントが、使用しないものも含め、コンテキスト内のすべての依存型を記述する必要があることです。関連する型はこれを必要としないため、別の関連する型をクラスに追加するには、クラスのインスタンスのみが、クライアントは変更しないでおくことができます。型族に対する関数従属性の主な利点は、いくつかの異常なケースを処理する際の柔軟性が追加されていることです。

参考文献
^ キセリョフ、オレグ; ペイトンジョーンズ、サイモン; Shan、Chung-chieh(2010)。「タイプ機能の楽しみ」 (PDF)。
^ Chakravarty、Manuel MT; ケラー、ガブリエレ; ペイトンジョーンズ、サイモン; マーロウ、サイモン(2005)。「クラスに関連付けられたタイプ」。プログラミング言語の原理に関する第32回ACMSIGPLAN-SIGACTシンポジウムの議事録。ACM Press:1–13。
^ 「GHCの型関数、型族、および関連する型-マスタープラン」。
^ Wehr、Stefan; Chakravarty、Manuel MT(2008)。「MLモジュールとHaskell型クラス:建設的な比較」。プログラミング言語とシステムに関する第6回アジアシンポジウムの議事録。Springer-Verlag。
^ 「Scalaのツアー:抽象型」。取得した23年2月2013。
^ Chakravarty、Manuel MT; ケラー、ガブリエレ; ペイトンジョーンズ、サイモン(2005)。「関連タイプの同義語」。関数型プログラミングに関する第10回ACMSIGPLAN国際会議の議事録。ACM Press:241–253。
^ 「型族(TF)対機能従属性(FD)」。

外部リンク
GHCでの型族の使用に関するHaskellWikiドキュメント