2010-12-16 12 views
8

Mam następujący typeclass które modele SQL-like optymalizacji zapytań:Haskell nakładających instancje i funkcje typu

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 

problemem jest to, że pojawia się błąd „Sprzeczne deklaracje instancji rodzina” na Zoptymalizowana funkcja typu. Dlaczego tak jest i jak mogę to rozwiązać? Byłoby naprawdę miło mieć "awaryjną instancję", zamiast wyczerpywać wszystkie przypadki (może to być całkiem sporo) ...

Odpowiedz

7

Nielegalne nakładanie instancji z rodzinami typów jest nielegalne. Szczegółowe informacje można znaleźć w części "Nakładanie się przykładów synonimów typów" na stronie GHC manual.

Powodem jest to, że posiadanie dwóch różnych możliwych wyników dla aplikacji funkcji typu w zależności od dostępnych instancji może prowadzić do braku pewności.

+0

Jak to obejść? –

+0

Nie mogę myśleć o żadnych obejściach oprócz wyczerpania wszystkich przypadków. Przepraszam! –