69993


以下すべてGHCiで作業してます。

[code]

    Prelude> data Barcode = Upca Int Int Int Int | Qrcode String
    
[/code]

と定義します。

まず`:type`で見てみます。

[code]

    Prelude> :type Upca
    Upca :: Int -> Int -> Int -> Int -> Barcode
    
    Prelude> :type Qrcode
    Qrcode :: String -> Barcode
    
[/code]

そして `:kind` で見てみます。

[code]

    Prelude> :kind Barcode
    Barcode :: *
    
[/code]

kindの `*` は項の数を表すなんて記述をみたりするのですが、 上記定義の場合 `Barcode型`を生み出すためには、`Intを4つ取るUpca`
もしくは `Stringを1つ取るQrcode`を用いなければならいので、ちょっと `*`
がどの部分をさしているのかわかりません（おそらく`Upca`と`Qrcode`に関する情報とはなにも関係ないとは思うのですが、であればどのあたりに注目して見ればよいんでしょうか）。

Intを4つ取るなんて表現してますが、Haskellは引数が1つずつ受け取ることは理解してます。

なんとなく別言語でいうところのジェネリクスの型引数の話をしているのが kind で確認したいことなんじゃないかなと感じています。ということで、上記
`Barcode型`には型引数？が登場していないので、もう少しサンプルが必要なのかもしれないですが...


CC BY-SA 4.0
2020-08-30T09:44:06.787
69992
2020-08-30T10:25:38.570
2020-08-30T10:01:40.977
9008
9008
question
haskell
kindが理解できない


> （おそらくUpcaとQrcodeに関する情報とはなにも関係ないとは思うのですが、であればどのあたりに注目して見ればよいんでしょうか）。

「なんとなく別言語でいうところのジェネリクスの型引数の話をしているのが kind
で確認したいことなんじゃないかな」と察していらっしゃるとおり、UpcaやQrcodeといった値コンストラクターの中身はここでは全く関係がなく、純粋にBarcodeが型引数をとるか否か、のみが関係しています。

Barcode型の場合型引数を全くとらないので、「単なる型」を表すkind、`*`となるわけです。

そのほか、Maybeは型引数を一つとるので`* -> *`, `(,)`（要素が二つのタプル）は型引数を二つとるので`* -> * ->
*`というkindとなっています。

余談: `*` は将来的に`Type`という名前に変わる予定です。こちらの方が「単なる型だよ！」ということが分かりやすいですね。

「なんで型引数の話しかしてないのにkindなんて仰々しい用語が出てくるの？」という疑問を感じた場合は、[About kind system of
Haskell (Part 1) - Haskell-jp](https://haskell.jp/blog/posts/2017/10-about-
kind-system-part1.html)とその続き[Haskellの種(kind)について (Part 2) - Haskell-
jp](https://haskell.jp/blog/posts/2017/13-about-kind-system-
part2.html)をご覧ください。  
結構難しい話ですが、kindの深遠な世界が見えるでしょう。


CC BY-SA 4.0
2020-08-30T10:25:38.570
69993
2020-08-30T10:25:38.570
8007
69992
answer