2016-07-28 21 views
1

Ist es möglich, Eq-Instanz für die B a abzuleiten, wenn zusätzliche Hilfe, z. Eq a irgendwo?Typ Familien und abgeleitete Instanzen (Eq)

{-# LANGUAGE TypeFamilies #-} 

class A a where 
    type B a 
    somef :: a -> B a -> B a -> Bool 

Frage deriving instances with type families und instance definitions for type families sind in der Nähe. Folgendes funktioniert nicht oder ähnliche Änderungen an type B a -line (oder nur die falschen versucht).

{-# LANGUAGE StandaloneDeriving #-} 
-- deriving instance Eq (B a) -- illegal application 
-- deriving instance Eq a => Eq (B a) -- illegal application 

Einschränkende Eq a => A a half nicht. Hinzufügen von Constraint zu somef kompiliert (somef :: Eq a => ...) und funktioniert für diese Methode. In diesem Fall wäre es jedoch nett zu sagen, dass die type B a im Allgemeinen gleichsetzbar ist (so dass nichtgleichwertige B's nicht erlaubt wären) und nicht Methode für Methode.

+0

Sie möchten beschränken können Klasseninstanzen, um selbst eine Instanz von Eq einzugeben? – FreeSalad

+0

Ja, um Ba-Typ-Instanzen auf Typen zu beschränken, die selbst Instanzen von Gl. – Gspia

Antwort

7

Ich denke, das funktioniert der Trick ...

{-# LANGUAGE TypeFamilies, FlexibleContexts #-} 

class Eq (B a) => A a where 
    type B a 
    somef :: a -> B a -> B a -> Bool 

Als Nachweis, dass es funktioniert, die folgende Instanz akzeptiert wird

data HasEqInstance = HasEqInstance deriving Eq 
instance A() where 
    type B() = HasEqInstance 
    somef = undefined 

Aber dieser abgelehnt mit No instance for (Eq NoEqInstance)

data NoEqInstance = NoEqInstance 
instance A() where 
    type B() = NoEqInstance 
    somef = undefined 
+0

Kudos, jetzt scheint es so klar (ich mache meine ersten Schritte mit Typfamilien). – Gspia