本当にわかりません。なぜそれが必要なのですか?つまり、同じ型パラメーターを使用する場合、それらは同じ型でなければならないということです。
コンパイラが無限ループを回避するのに役立つと聞きました。誰かがそれについてもう少し詳しく教えてもらえますか?
最後に、Real World Haskellでの関数従属性の使用に関して従う必要のある「パターンとプラクティス」はありますか?
【フォローアップ質問】
class Extract container element where
extract :: container -> element
instance Extract (a,b) a where
extract (x,_) = x
上記のコードでは、コンテナと要素の両方に同じ型変数「a」を使用しました。したがって、コンパイラはこれら2つの型が同じ型であると推測できると思います。
しかし、GHCiでこのコードを試したところ、次のフィードバックがありました。
*Main> extract('x',3)
<interactive>:1:0:
No instance for (Extract (Char, t) element)
arising from a use of `extract' at <interactive>:1:0-13
Possible fix:
add an instance declaration for (Extract (Char, t) element)
In the expression: extract ('x', 3)
In the definition of `it': it = extract ('x', 3)
それらの1つがタイプ'Char'として指定されているのに、なぜもう1つはまだ未解決のタイプ' element'であるのですか?