5

私は本当にそれを得ることができません。なぜ私たちはそれを必要としますか?つまり、同じ型パラメータを使用すると、同じ型のパラメータでなければならないということです。ハスケルの機能依存性

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

最後に、Real World Haskellの関数依存性の使用法に従わなければならない「パターンと実践」はありますか?

[フォローアップ質問]上記のコードで

class Extract container element where 
    extract :: container -> element 

instance Extract (a,b) a where 
    extract (x,_) = x 

、I「」は、容器と素子の両方について、私は、コンパイラは、このようにこれらの2つのタイプことを推測することができると思う同じタイプの変数を使用同じタイプです。私はGHCiの中で、このコードをしようとしたとき

はしかし、私は次のようなフィードバックを得ました。そのうちの一つが、他の1はまだ未解決のタイプ「要素である理由タイプ「シャア、に指定されてい

*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) 

'?

+5

http://www.haskell.org/haskellwiki/Functional_dependencies help? – lijie

答えて

6

これはかなりexplainsだと思いました。したがって、基本的にa - > bのFD関係がある場合は、タイプクラスのインスタンスには 'a'と 'b'が1つだけ存在することができますが、Int Intを持つことはできません。それは、「b」が「a」から一意的に決定されると言われるとき、それらが意味することです。これは任意の数の型パラメータにまで及ぶ。なぜそれが必要なのか1.推論をタイプ2.時にはそのような制約が必要な場合があります。

FDの代わりに、タイプファミリ拡張がありますが、FDのすべてのケースではありません。

+0

ご意見ありがとうございます。その記事は素晴らしいです。今私は本当の質問が何であるか正確に知っています。あなたは「時にはあなたはそのような制約が欲しい」と言った。私はこの部分を理解しています。しかし、私は型推論のためにそれがなぜ必要なのか分かりません。私は別のフォローアップの質問で私の質問を更新しました。この例は、あなたが上記のwikiページから来たものです。 – aXqd

+0

私はついにそれを理解しました。コンパイラはまだタイプクラスの正しいインスタンスを見つけようとしているので、その特定のインスタンスとはまだ関係ありません。私は戻り値の型を与えないので、あいまいです。 – aXqd

+0

関数の依存関係を追加すると、コンテナの型が一致している限り、コンパイラはそのインスタンスを使用できます。 – aXqd

関連する問題