私が見た機能的な依存関係の例は、マッピングcontainer -> element
、およびarguments -> result
(のようにMult Matrix Vector Vector
) に要約されます。それらは型関数でよりよく表現されるようです。データベース理論では、この形式ではない ( のような) より複雑な関係が考慮されますa -> b, b -> a
。
型関数を使用して適切に記述できない Haskell の FD の使用例はありますか?
私が見た機能的な依存関係の例は、マッピングcontainer -> element
、およびarguments -> result
(のようにMult Matrix Vector Vector
) に要約されます。それらは型関数でよりよく表現されるようです。データベース理論では、この形式ではない ( のような) より複雑な関係が考慮されますa -> b, b -> a
。
型関数を使用して適切に記述できない Haskell の FD の使用例はありますか?
Manuel Chakravartyが説明しているように、型関数と関数の依存関係はほぼ同じ表現力を持っているため、1 つの定式化を別の定式化に変換できます。GADT や UndecidableInstances などの他の言語拡張機能との相互作用を見た場合にのみ、それらは異なり始めます。型族は、GADT や存在型との相互作用が大幅に単純であるため、現在 GHC での実装に好まれているようです。
ハインリッヒ・アフェルムスがすでに言ったように、MPTC+FunDepsとTFだけは同等です。特に重複するインスタンスを使用して他の拡張機能と組み合わせると、違いが生じます。FunDepsがオーバーラップを許可しているのに対し、オーバーラップが許可されている場合、TFは不健全です。たとえば、FunDepsを使用してタイプの同等性を簡単に実装できます。
data HTrue
data HFalse
class TypeEq a b eq | a b -> eq
instance TypeEq a a HTrue
instance eq ~ HFalse => TypeEq a b eq
ここでのポイントは重複しています。原則として、重複することなく型の同等性を実装することは可能ですが、コンパイラのサポートが必要になります。そのアプローチは、ここでOlegによって説明されています:http://okmij.org/ftp/Haskell/typeEQ.html
PSこのテーマに関するhaskell-primeメーリングリストについては長い議論がありました。