8

SQLのようなクエリ最適化をモデル化する次の型クラスがあります。

class OptimizableQuery q where
  type Optimized q :: *
  optimize :: q -> Optimized q

instance Query q => OptimizableQuery q where
  type Optimized q = q
  optimize q = q

instance (Query q, OptimizableQuery q) => OptimizableQuery (Select (Select q p) p) where
  type Optimized (Select (Select q p) p) = Select (Optimized q) p
  optimize (Select (Select q _) p) = Select (optimize q) p

問題は、最適化された型関数で「競合するファミリインスタンス宣言」というエラーが発生することです。それはなぜですか、どうすれば解決できますか?すべてのケース(かなり多くなる可能性があります)を使い果たすのではなく、「フォールバックインスタンス」があると本当に便利です...

4

1 に答える 1

7

型族と重複するインスタンスを持つことは違法です。詳細については、GHCのマニュアル「タイプシノニムインスタンスの重複」を参照してください。

その理由は、使用可能なインスタンスに応じて、型関数適用に対して2つの異なる結果が生じる可能性があるため、不健全になる可能性があるためです。

于 2010-12-16T16:58:50.767 に答える