7
Diese Erklärung nicht funktioniert:GHC nicht akzeptiert GADT Typ Unterschrift
data Identity a where {Identity :: (->) a (Identity a)}
Wie dieses Problem beheben?
Diese Erklärung nicht funktioniert:GHC nicht akzeptiert GADT Typ Unterschrift
data Identity a where {Identity :: (->) a (Identity a)}
Wie dieses Problem beheben?
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
Funktioniert nicht in GHC 7.6. – ThePiercingPrince
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
Dies sollte wahrscheinlich als Fehler gemeldet werden, wenn dies nicht bereits geschehen ist. – kosmikus
@ 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 '!'). –