2013-12-23 14 views
16

In GHC-7.7 (und 7.8) geschlossen Familien Typ eingeführt wurden:Geschlossene Familien und Typinferenz in Haskell

Eine geschlossene Familie an einem Ort alle seine Gleichungen definiert hat und nicht verlängert werden kann, während eine offene Familie kann Instanzen über Module verteilt haben. Der Vorteil einer geschlossenen Familie ist, dass seine Gleichungen um, ähnlich einem Begriff Ebene Funktionsdefinition

versucht werden möchte ich Sie fragen, warum der folgende Code kompiliert nicht? GHC sollte in der Lage sein, auf alle Typen zu schließen - GetTheType ist nur für den Typ X definiert, und wenn wir die markierte Zeile auskommentieren, wird der Code kompiliert.

Ist dies ein Fehler in GHC oder geschlossenen Typ Familien hat solche Optimierungen noch nicht?

Code:

{-# LANGUAGE TypeFamilies #-} 

data X = X 

type family GetTheType a where 
    GetTheType X = X 

class TC a where 
    tc :: GetTheType a -> Int 

instance TC X where 
    tc X = 5 

main = do 
    -- if we comment out the following line, the code compiles 
    let x = tc X 
    print "hello" 

Und der Fehler ist:

Couldn't match expected type ‛GetTheType a0’ with actual type ‛X’ 
The type variable ‛a0’ is ambiguous 
In the first argument of ‛tc’, namely ‛X’ 
In the expression: tc X 
+0

1. GHC 7.8.X noch nicht freigegeben wird, so ist es ein bisschen zu früh ist, zu nennen es einen Fehler 2. Sind Sie sicher, dass geschlossene Familien gehen der Standard sein und keine Art von Flag oder Pragma erfordern? –

+1

Ich fragte gerade Richard Eisenberg vor einer Woche, sehen Sie die Kommentare an der Unterseite [hier] (http://typesandkinds.wordpress.com/2012/12/22/ordered-overlapping-type-family-instances/). Ich bin auch sehr gespannt auf das Potenzial dort. Ich skizzierte auf Papier die Mechanismen, wie ich denke, dass Inferenz funktionieren sollte, und arbeite mich langsam an die Idee, GHC zu hacken, aber TBH bin mir nicht sicher, dass das in einem vernünftigen Zeitrahmen passieren wird. – jberryman

+0

@ ThomasM.DuBuisson: Wir wissen es noch nicht, aber da diese Funktion in GHC 7.7 verfügbar ist, können wir es testen und einige seiner Verhaltensweisen als Bugs oder nicht. GHC 7.8 sollte bald veröffentlicht werden, denke ich. –

Antwort

10

Es ist nichts falsch mit geschlossenen Typ Familien. Das Problem ist, dass Typfunktionen nicht injektiv sind.

Sag mal, könnten Sie diese geschlossene Funktion haben:

data X = X 
data Y = Y 

type family GetTheType a where 
    GetTheType X = X 
    GetTheType Y = X 

Sie X das Argument Typ aus dem Ergebnistyp nicht ableiten kann.

Daten Familien sind injektiv, aber nicht geschlossen:

{-# LANGUAGE TypeFamilies #-} 

data X = X 

data family GetTheType a 

data instance GetTheType X = RX 

class TC a where 
    tc :: (GetTheType a) -> Int 

instance TC X where 
    tc RX = 5 

main = do 
    let x = tc RX 
    print "hello" 
+2

Tippfehler? "Daten Familien sind injektiv, aber ** nicht ** geschlossen" –

+0

@maxtaldykin Typo behoben, Danke. – mgampkay

+4

Aber bei geschlossenen Typfamilien könnte GHC überprüfen, ob die Typfunktion injektiv ist oder nicht. Ich denke, das war einer der Gründe, sie zu haben. Ich tue nicht, wenn jemand daran arbeitet. –