2010-12-16 36 views
8

Ben modeller SQL benzeri sorgu optimizasyonu aşağıdaki typeclass:Haskell örtüşen örneklerini ve tip fonksiyonlar

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 

Sorun Optimize tip fonksiyonu üzerine "Çakışan aile örneği beyanları" hatası alıyorum olmasıdır. Neden böyle ve nasıl çözebilirim? Tüm vakaları tüketmek yerine (“çok fazla olabilir”) bir "geri çekilme örneği" almak gerçekten hoş olurdu ...

cevap

7

Tip aileleriyle çakışan örneklere sahip olmak yasadışı. Ayrıntılar için GHC manual, "Eşanlamlı eşanlamlı örneklerin çakışması" konusuna bakın. Nedeni, mevcut örneklere bağlı olarak bir tip fonksiyon uygulaması için iki farklı olası sonuca sahip olmanın aksaklığa yol açabilmesidir.

+0

Bu konu üzerinde nasıl çalışırım? –

+0

Tüm vakaları tüketmekten başka bir çözüm düşünemiyorum. Afedersiniz! –