/ / Geschlossene Typfamilien und Typrückschlüsse in Haskell - Haskell, Typen, GHC, Typinferenz, Typfamilien

Geschlossene Typfamilien und Typinferenz in Haskell - Haskell, Typen, GHC, Typinferenz, Typfamilien

In GHC-7.7 (und 7.8) wurden geschlossene Familien eingeführt:

Eine geschlossene Familie hat alle ihre Gleichungenan einer Stelle definiert und kann nicht erweitert werden, während eine offene Familie Instanzen verbreiten kann über Module hinweg. Der Vorteil einer geschlossenen Familie ist, dass ihre Gleichungen werden der Reihe nach ausprobiert, ähnlich wie bei einer Funktionsdefinition auf Termebene

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

Ist das ein Fehler in GHC oder geschlossene Familien haben 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

Antworten:

10 für die Antwort № 1

Mit geschlossenen Familien ist nichts falsch. Das Problem ist, dass Typ-Funktionen nicht injektiv sind.

Sagen wir mal, Sie könnten diese geschlossene Typ-Funktion haben:

data X = X
data Y = Y

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

Sie können den Argumenttyp nicht vom Ergebnistyp ableiten X.

Datenfamilien 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"