質問: Upca Int Int Int Int | Qrcode String ``` と定義します。 まず`:type`で見てみます。 ``` Prelude> :type Upca Upca :: Int -> Int -> Int -> Int -> Barcode Prelude> :type Qrcode Qrcode :: String -> Barcode ``` そして `:kind` で見てみます。 ``` Prelude> :kind Barcode Barcode :: * ``` kindの `*` は項の数を表すなんて記述をみたりするのですが、 上記定義の場合 `Barcode型`を生み出すためには、`Intを4つ取るUpca` もしくは `Stringを1つ取るQrcode`を用いなければならいので、ちょっと `*` がどの部分をさしているのかわかりません(おそらく`Upca`と`Qrcode`に関する情報とはなにも関係ないとは思うのですが、であればどのあたりに注目して見ればよいんでしょうか)。 Intを4つ取るなんて表現してますが、Haskellは引数が1つずつ受け取ることは理解してます。 なんとなく別言語でいうところのジェネリクスの型引数の話をしているのが kind で確認したいことなんじゃないかなと感じています。ということで、上記 `Barcode型`には型引数?が登場していないので、もう少しサンプルが必要なのかもしれないですが...
回答: > > (おそらくUpcaとQrcodeに関する情報とはなにも関係ないとは思うのですが、であればどのあたりに注目して見ればよいんでしょうか)。 > > > 「なんとなく別言語でいうところのジェネリクスの型引数の話をしているのが kind で確認したいことなんじゃないかな」と察していらっしゃるとおり、UpcaやQrcodeといった値コンストラクターの中身はここでは全く関係がなく、純粋にBarcodeが型引数をとるか否か、のみが関係しています。 Barcode型の場合型引数を全くとらないので、「単なる型」を表すkind、`*`となるわけです。 そのほか、Maybeは型引数を一つとるので`* -> *`, `(,)`(要素が二つのタプル)は型引数を二つとるので`* -> * -> *`というkindとなっています。 余談: `*` は将来的に`Type`という名前に変わる予定です。こちらの方が「単なる型だよ!」ということが分かりやすいですね。 「なんで型引数の話しかしてないのにkindなんて仰々しい用語が出てくるの?」という疑問を感じた場合は、About kind system of Haskell (Part 1) - Haskell-jpとその続きHaskellの種(kind)について (Part 2) - Haskell-jpをご覧ください。 結構難しい話ですが、kindの深遠な世界が見えるでしょう。