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

2019-02-22

以下のようなコードを書いて 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 だと思い込んで悩んでしまいました...