2016-07-21 19 views
2

Wenn ich Code wie folgt aus:Assoziierte Art Familie ausfällt, funktioniert, wenn Standalone gemacht

class C where 
    type T t1 t2 
    ... 

instance C (X t) where 
    type T (X t) (t a b) = a 
    ... 

ich den Fehler (mit GHC Kopf):

• Polymorphic type indexes of associated type ‘T’ 
    (i.e. ones independent of the class type variables) 
    must be distinct type variables 

Vermutlich ist dies, weil (t a b) ist nicht eine einfache Variable wie der Fehler impliziert, sollte es sein.

Aber ich kann einfach den Code wie folgt neu zu organisieren:

type family T t1 t2 

class C where 
    ... 

type instance T (X t) (t a b) = a 

instance C (X t) where 
    .... 

Und dann scheint jetzt alles gut zu funktionieren.

Weil eine etwas unordentlichere Syntax, verliere ich alles, indem ich Typfamilien-Definitionen aus Klassen nehme, oder sind In-Klassen-Definitionen nur syntaktischer Zucker, so dass sie herauszunehmen eine relativ kostenlose Lösung ist?

+1

Was sind die Parameter für 'Klasse C'? Ich denke, das könnte wichtig sein. – chi

+0

Mein Verständnis ist, dass zur Zeit verbundene Typfamilien ziemlich syntaktischer Zucker sind. Ich bin nicht wirklich davon überzeugt, dass sie als solche hinzugefügt worden sein sollten. – dfeuer

Antwort

4

Diese

type family T t1 t2 
type instance T (X t) (t a b) = a 

funktioniert ungefähr so ​​

class K t1 t1 where 
    type T t1 t2 
instance K (X t) (t a b) where 
    type T (X t) (t a b) = a 

Beachten Sie, wie alle Variablen t1,t2 sind Parameter der Klasse K. Tatsächlich , ist dies erforderlich, wenn Variablen mehrfach auftreten (dh nicht-linear), wie die entsandten Fehlerzustände:

• Polymorphic type indexes of associated type ‘T’ 
    (i.e. ones independent of the class type variables) 
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    must be distinct type variables 

Also, entweder Sie alle diese Variablen vom Typ Ihrer Klasse hinzuzufügen, oder - auf den gleichen Effekt - Sie verschieben die Typfamilie außerhalb der Klasse.


Dies wird in GHC 8.0 kompiliert.

{-# LANGUAGE TypeFamilies, PolyKinds #-} 

data X (t :: k) = X 

class C t1 where 
    type T t1 t2 

instance C (X (t :: * -> * -> *)) where 
    type T (X t) (t a b) = a