2013-04-21 10 views
6

Angenommen, ich habe den folgenden (fehlerhaften) Code.Haskell Inaccessible Code-Fehler?

data A a b where 
    APure :: (A a b) 
    AApply :: A (A b c) c 

test :: (A a b) -> a -> b 
test (APure) a = a 
test AApply a = undefined 

GHC wird mir dann diesen Fehler geben:

Couldn't match type `b' with `A b1 b' 
    `b' is a rigid type variable bound by 
     the type signature for test :: A a b -> a -> b 
Inaccessible code in 
    a pattern with constructor 
    AApply :: forall c b. A (A b c) c, 
    in an equation for `test' 
In the pattern: AApply 
In an equation for `test': test AApply a = undefined 

Ist das nicht diese Fehlermeldung völlig falsch? Der Fehler hat nichts mit AApply zu tun.

+1

Wie soll 'AApply' den allgemeinen Typ' A a b' haben, wenn Sie es bereits als 'A (A b c) c' deklarieren? Es ist, als ob du 'concat 'definieren würdest: [a] -> [b]' wie 'concat' = concat': Wie wird Haskell 'a'" down "zu' [b] '? – leftaroundabout

+1

Ja, es ist nicht intuitiv. Vielleicht solltest du [einen Fehler melden] (http://hackage.haskell.org/trac/ghc/newticket?type=bug). –

+0

@leftaroundabout Ich verstehe nicht wirklich, was Sie meinen, aber dieser Fall ist absolut korrekt. Informieren Sie sich über PatternMatching mit GADTs. – nulvinge

Antwort

4

Isn't this error message completely wrong? The error has nothing to do with AApply .

Nicht vollständig. Es ist wohl ein Fehler, dass Sie diese Fehlermeldung erhalten, aber es ist nicht komplett aus der Basis.

Betrachten Sie die ganze Sache zusammen nach dem Betrachten der Stücke.

test (APure) a = a 

sagt, wir haben eine Funktion

test :: A a b -> r -> r 

setzen, die zusammen mit der Signatur

test :: (A a b) -> a -> b 

und vereinigen, den Typ Fehler aus der ersten Gleichung zu ignorieren, die Art zu

verfeinert
test :: A r r -> r -> r 

Schauen Sie sich die Gleichung

test AApply a = undefined 

und sieht, wie das unter der raffinierten Art nicht zugänglich ist, da

AApply :: A (A b c) c 

c ~ A b c 

mit sich bringen würde, wenn AApply ein gültiges erstes Argument sind.

+0

Ich vermutete, dass so etwas passiert ist. Warum vereinheitlicht es sich zu "A r r -> r -> r"? Wie kann der Typ sich ändern, wenn der Typ der Funktion angegeben wird? – nulvinge

+0

Mit GADTs erhalten Sie Typ Verfeinerung. Ich denke, was hier passiert, ist ein Fehler im Typ-Checker (und mit 6.12.3 erhalten Sie das nicht überraschende '' konnte nicht erwartet Typ 'b 'gegen abgeleitete Typ' a'' für die erste Gleichung; 7.0, 7.2 und 7.4 geben nur den Fehler für die zweite Gleichung; 7.6 beide) - resp. der Hersteller der Fehlermeldung, die Verfeinerung ist fehlgegangen. Es sollte auf den Fehler in der ersten Gleichung gestoppt haben. Aber als es danach weiterging, funktionierte es mit inkonsistenten Hypothesen, und so ist es nicht allzu überraschend, dass es mit einem albernen Ergebnis endet. –

+0

Oh, also ist es ein Bug, der behoben ist (aber meine GHC-Version ist zu alt). Vielen Dank! – nulvinge