2010-12-16 10 views
8

I持っているモデルSQLに似たクエリの最適化以下の型クラス:Haskellのオーバーラップインスタンスと型の関数

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 

問題は、私は最適化されたタイプの機能の「競合家族のインスタンス宣言」エラーを取得するということです。それはなぜですか、どうすれば解決できますか?すべてのケース(かなり多くの場合があります)を使い果たす必要がなく、「代替インスタンス」を持つことは本当にうれしいでしょう...

答えて

7

タイプファミリーと重複するインスタンスを持つことは不正です。詳細は、GHC manual「タイプ同義語インスタンスの重複」を参照してください。

理由は、利用可能なインスタンスに応じて型関数アプリケーションに対して2つの異なる結果が生じると、健全性につながる可能性があるからです。

+0

どうすれば対処できますか? –

+0

私は、すべてのケースを使い果たしてからの回避策は考えていません。ごめんなさい! –