Haskellの型クラス宣言は中身まで見ないとKindがわからない

2019-02-22 programming Haskell

Haskellの型クラス宣言では, どんな関数が定義されているかまで見ないとKindが分かりません. 具体例で確かめてみました.

以下のようなコードを書いてGHCi上に読み込んでみました.

-- test.hs

class Bar x where
    bar :: x -> x

class Foo x where
    foo :: x a -> a
> :l test.hs

> :k Bar
Bar :: * -> Constraint

> :k Foo
Foo :: (* -> *) -> Constraint

こんなふうに, classキーワードの部分の見た目は同じでも, それぞれが備えている関数によってKindが変わります.

classキーワードだけを見て, Kindが* -> Constraintだと思い込んで悩んでしまいました…