Haskellの型クラス宣言は中身まで見ないとKindがわからない
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
だと思い込んで悩んでしまいました…