関数型プログラミング言語Haskell Part17
■ このスレッドは過去ログ倉庫に格納されています
0810デフォルトの名無しさん
2012/03/04(日) 10:58:52.73eq :: (Eq a) => a -> a -> Bool
eq (Hoge x) (Hoge y) = ...
型変数 a から具体的な TTT 型に推論する為の道筋がない
もう少し言えば、型シグネチャ内の a は型「変数」だ
型に関する式における自由変数と言っても良い
従って、最終的には何かの具体的な型で「束縛」しないと
関数全体の型が決定できない
関数のシグネチャ内にある自由変数は、
その関数を呼ぶ側、つまり外で具体的な型を与えて束縛してやる必要がある
(型に関する式だけでなく、自由変数と言ったら普通そういうもんだ)
しかし、例示したコード片は呼び出し側で型変数 a の型を決定していない
(というかこの場合そもそも呼び出し側が無い)
決定していないにも関わらず、「関数内で」勝手に TTT 型と決めつけられている
だから、ちょっと待て、まだ決定できんだろうがハゲ、と怒られる
こういうことがある中で、インスタンス宣言にシグネチャが書けると、
(Eq a) => a -> a -> Bool と書いても TTT -> TTT -> Bool と書いても、
どっちをとっても何かおかしいよねぇ、となる
なら書けない方が良い
・・・冷静に考えると、本当はもっと全然別の単純な理由かも知れん
(クラス宣言の方でシグネチャ書いてるんだからもう良いだろ、という理由)
■ このスレッドは過去ログ倉庫に格納されています