質問: 『すごいHaskell』を読みながら本にあるコードを入力していっているのですが ``` ghci> :t (==) (==) :: (Eq a) => a -> a -> Bool ``` と型クラスで表示されると本にあったものが 実際にコンソールで入力してみると ``` ghci> :t (==) (==) :: Eq a => a -> a -> Bool ``` と`Eq q`が括弧で囲まれていない状態で表示されました。 特に気にしなくてもいいかとも思ったのですが、 括弧の有無が厳密な言語なので もしこの表記の違いの理由を知ってる方がいたら教えて下さい。
回答: カッコが必須なのは、制約を2つ以上書くときです。 例えば、GHCiで `:i (,)` を実行すると、下記のように`(a, b)`の`Eq`型クラスのインスタンスは、`a`と`b`両方が`Eq`のインスタンスでないといけないので、それを表現するためにカッコで囲って`Eq a`と`Eq b`を列挙しています。 ``` ghci> :i (,) ... instance (Eq a, Eq b) => Eq (a, b) -- Defined in ‘GHC.Classes’ ... ```