69996


下記のように型引数の個数を変えて kind を確認してみました。  
型引数を受け取らないのに `*` がついているのがよくわかりません。

また、型引数が複数以上の最後の `-> *` の部分は具体的にどんな型が返ることを言っているのでしょうか？ 下記 `BBB` の場合は `-> *`
が示してるのは `BBB型` のことですか？

**型引数をなにも受けとらない場合**

[code]

    Prelude> data AAA = AAA
    Prelude> :kind AAA
    AAA :: *
    
[/code]

**型引数をひとつ受け取る場合**

[code]

    Prelude> data BBB a = BBB
    Prelude> :kind BBB
    BBB :: * -> *
    
[/code]

**型引数を2つ受け取る場合**

[code]

    Prelude> data CCC a b = CCC
    Prelude> :kind CCC
    CCC :: * -> * -> *
    
[/code]


CC BY-SA 4.0
2020-08-30T10:44:48.923
69994
2020-08-30T14:01:25.820
9008
question
haskell
kindで表示される記法に納得がいかない


`*` という kind は、何も型引数を受け取らない「単なる型」を表すものです。

たとえば `Int` という型は、`1` とか `-2` とか `3 + 5` とかいった、値が求まれば整数になる項たちを表しているものです。同じように
`*` という kind は、`Int` とか `String` とか `Maybe Int` とかいった単なる型たちを表しているものなのです。

`Maybe` には `* -> *` という kind が付きますが、これは型を受け取って型を返すことを表しています。`Maybe :: * -> *`
と `Int :: *` があって、これを型適用すると `Maybe Int :: *` になる訳です。

kind で考えるのが分かりづらければ、まず型で考えてみてください。`Int` は整数を表す型で、`Int -> Int`
は整数を受け取って整数を返す関数です。たとえば絶対値を返す関数 `abs :: Int -> Int` と整数 `-2 :: Int`
があって、これを適用すると `abs (-2) :: Int` になる訳です。これと類似のお話を型のレベルへ 1 段上げたものが kind です。


CC BY-SA 4.0
2020-08-30T11:12:18.433
69996
2020-08-30T14:01:25.820
2020-08-30T14:01:25.820
19110
19110
69994
answer