2010-12-16 10 views
8

Ich habe folgendes typeclass die Modelle eine SQL-ähnliche Abfrageoptimierung:Haskell überlappende Instanzen und Typ Funktionen

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 

das Problem ist, dass ich den Fehler „Widersprüchliche Familie Instanz Erklärungen“ über die optimierte Funktion des Typs erhalten. Warum ist das und wie kann ich es lösen? Es wäre wirklich schön, eine "Fallback-Instanz" zu haben, anstatt alle Fälle ausschöpfen zu müssen (was recht viele sein könnten) ...

Antwort

7

Es ist illegal, überlappende Instanzen mit Typfamilien zu haben. Details finden Sie unter GHC manual, "Überlappen von Typ-Synonym-Instanzen".

Der Grund ist, dass zwei verschiedene mögliche Ergebnisse für eine Typ-Funktion-Anwendung in Abhängigkeit von den verfügbaren Instanzen zu Unzuverlässigkeit führen können.

+0

Wie kann ich das umgehen? –

+0

Ich kann mir keine Problemumgehungen vorstellen, abgesehen von der Erschöpfung aller Fälle. Es tut uns leid! –