8

本当にわかりません。なぜそれが必要なのですか?つまり、同じ型パラメーターを使用する場合、それらは同じ型でなければならないということです。

コンパイラが無限ループを回避するのに役立つと聞きました。誰かがそれについてもう少し詳しく教えてもらえますか?

最後に、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'であるのですか?

4

1 に答える 1

8

これはかなりうまく説明できると思いました。つまり、基本的にa-> bのFD関係がある場合、それは型クラスのインスタンスの場合、任意の「a」を持つ「b」は1つだけであるため、Int Intですが、IntFloatも使用できません。それが、「b」が「a」から一意に決定されると言われるときの意味です。これは、任意の数のタイプパラメータに拡張されます。それが必要な理由は次のとおりです。1。型推論2.そのような制約が必要な場合があります。

FDの代替は、型族の拡張ですが、FDのすべての場合に対応しているわけではありません。

于 2010-11-25T15:17:25.617 に答える