2014-05-10 6 views
7

Diese Erklärung nicht funktioniert:GHC nicht akzeptiert GADT Typ Unterschrift

data Identity a where {Identity :: (->) a (Identity a)} 

Wie dieses Problem beheben?

+11

Verwenden Sie die Infixform von '->'. Ich habe keine Ahnung, warum es einen Unterschied macht, aber in der Tat. (d. h. 'Daten ... wobei {Identität :: a -> Identität a}') – jgriego

+4

Dies sollte wahrscheinlich als Fehler gemeldet werden, wenn dies nicht bereits geschehen ist. – kosmikus

+7

@ qu4ntumcpa: Der Unterschied ist, dass Signaturen in GADT-Konstruktor-Deklarationen Strictness-Annotationen ('!') Beinhalten können, die an keiner anderen Stelle erlaubt sind. Ich vermute, dass GHC zwei getrennte Grammatiken für GADT-Typ-Signaturen und andere Typ-Signaturen aufweist. Außerdem kann ich mir einige (schwache!) Argumente vorstellen, dass Konstruktoren nicht wirklich Funktionen sind, und dass die Präfixsyntax '(->)' irgendwie andeutet, dass man sie frei verallgemeinern kann (was nicht wahr ist, wiederum wegen '!'). –

Antwort

2

Mindestens ebenso von GHC 7,8, , wenn Sie einschalten GADT Unterstützung, dann Ihren Code typechecks und tut, was würden Sie erwarten:

{-# LANGUAGE GADTs #-} 
data Identity a where {Identity :: (->) a (Identity a)} 

ergibt:

GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Main    (foo.hs, interpreted) 
Ok, modules loaded: Main. 
λ» :i Identity 
data Identity a = Identity a -- Defined at foo.hs:2:1 
+0

Funktioniert nicht in GHC 7.6. – ThePiercingPrince

Verwandte Themen