数理論理学とコンピュータサイエンスの分野である型理論では、種とは型コンストラクタの型、またはあまり一般的ではないが、高階型演算子の型を指します。種システムは、本質的には「1 レベル上」の単純な型付けのラムダ計算であり、「型」と表記され、その名前が付けられたプリミティブ型を備えています。プリミティブ型は、型パラメータを必要としない任意のデータ型の種です。
種類は「(データ) 型の型」と説明されて混乱を招くことがありますが、実際にはむしろ引数指定子です。構文的には、多態型を型コンストラクタと見なし、非多態型をヌル引数型コンストラクタと見なすのが自然です。ただし、すべてのヌル引数コンストラクタ、つまりすべての単態型は、同じ最も単純な種類、つまり を持ちます。
高階型演算子はプログラミング言語では一般的ではないため、ほとんどのプログラミング実務では、データ型と、パラメトリック多態性を実装するために使用されるコンストラクタの型を区別するために種類が使用されます。種類は、 C++、[1]、 Haskell、Scalaなど、プログラムからアクセス可能な方法でパラメトリック多態性を考慮した型システムを持つ言語に、明示的または暗黙的に現れます。[2]
例
- 「型」と発音される型は、 nullary型コンストラクタとして見られるすべてのデータ型の種類であり、このコンテキストでは適切な型とも呼ばれます。これには通常、関数型プログラミング言語の関数型が含まれます。
- 単項 型コンストラクタの種類です。たとえば、リスト型コンストラクタなどです。
- は、バイナリ型コンストラクタ(カリー化経由)の種であり、例えばペア型コンストラクタの種であり、関数型コンストラクタの種でもある(その適用の結果と混同しないでください。関数型自体が関数型であるため、種は)
- は、単項型構成子から適切な型への高階型演算子の一種である。[3]
Haskell の種類
(注: Haskell のドキュメントでは、関数の型と種類の両方に同じ矢印が使用されています。)
Haskell 98 [4]の種システムには、正確に2つの種が含まれます。
- 「タイプ」と発音されるものは、すべてのデータ型の種類です。
- は単項 型コンストラクタの種であり、 kind の型を受け取り、 kind の型を生成します。
居住型(Haskell では適切な型はこのように呼ばれます)は値を持つ型です。たとえば、図を複雑にする型クラスを4無視すると、は型 の値でありInt、は型(Int のリスト)[1, 2, 3]の値です。したがって、とは種 を持ちますが、や などの関数型も同様です。
[Int]Int[Int]Int -> BoolInt -> Int -> Bool
型構築子は 1 つ以上の型引数を受け取り、十分な引数が与えられた場合にデータ型を生成します。つまり、カリー化により部分適用をサポートします。 [5] [6]これは Haskell がパラメトリック型を実現する方法です。たとえば、型[](リスト) は型構築子です。これはリストの要素の型を指定するために 1 つの引数を受け取ります。したがって、[Int](Int のリスト)、[Float](Float のリスト)、さらには[[Int]](Int のリストのリスト)も[]型構築子の有効な適用です。したがって、[]は種類 の型です。 は種類 を持つため、これに適用すると種類 のになります。2タプルの構築子の種類、3 タプルの構築子の種類、などとなります。
Int[][Int](,)(,,)
親切な推論
標準 Haskell では、多態的な種類は許可されません。これは、Haskell でサポートされている型のパラメトリック多態性とは対照的です。たとえば、次の例をご覧ください。
データツリーz =リーフ|フォーク(ツリーz ) (ツリーz )
の種は、 だけでなく など、z何でもかまいません。Haskell は、型が明示的に別のことを示さない限り (以下を参照)、デフォルトで種を常に と推論します。したがって、型チェッカーは、次の の使用を拒否します。
Tree
type FunnyTree = Tree [] -- 無効
の種類が[]、の期待される種類(常に )と一致しないためです。
z
ただし、高階型演算子は許可されます。例:
データApp unt z = Z ( unt z )
には種類があり、つまり単項データ コンストラクターであることが期待され、その引数 (型である必要がある) に適用され、別の型を返します。
unt
GHC には拡張機能 がありPolyKinds、これを と組み合わせることでKindSignatures多態的な種類が可能になります。例:
データTree ( z :: k ) = Leaf | Fork ( Tree z ) ( Tree z )型FunnyTree = Tree [] -- OK
GHC 8.0.1以降では、型と種類が統合されました。[7]
参照
参考文献
- ピアス、ベンジャミン (2002)。型とプログラミング言語。MIT プレス。ISBN 0-262-16209-1。、第 29 章「型演算子と種類分け」
- ^ 「CS 115: パラメトリックポリモーフィズム: テンプレート関数」www2.cs.uregina.ca . 2020年8月6日閲覧。
- ^ 「Generics of a Higher Kind」(PDF) 。 2012年6月10日時点のオリジナル(PDF)からアーカイブ。 2012年6月10日閲覧。
- ^ ピアス(2002)、第32章
- ^ 種類 - Haskell 98 レポート
- ^ 「第4章 宣言とバインディング」。Haskell 2010 言語レポート。 2012年7月23日閲覧。
- ^ Miran, Lipovača. 「Haskell を学んで大いに役立てよう!」独自の型と型クラスの作成。2012年7 月 23 日閲覧。
- ^ 「9.1. 言語オプション — Glasgow Haskell コンパイラ ユーザーズ ガイド」。
