2014-05-10 13 views
7

Questa dichiarazione non funziona:GHC non accetta GADT tipo di firma

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

come risolvere questo problema?

+11

Utilizzare il forma infissa di '->'. Non ho idea del perché faccia la differenza, ma in effetti lo fa. (ad esempio 'data ... dove {Identity :: a -> Identity a}') – jgriego

+4

Questo dovrebbe probabilmente essere segnalato come un bug se non lo è già stato. – kosmikus

+7

@ qu4ntumcpa: la differenza è che le firme nelle dichiarazioni del costruttore GADT possono includere annotazioni di rigore ('!'), Che non sono consentite in nessun altro luogo. Sospetto che GHC abbia due grammatiche separate per le firme di tipo GADT e altre firme di tipo. Inoltre, posso immaginare alcuni (deboli!) Argomenti che i costruttori non sono realmente funzioni, e che il sintassi del prefisso '(->)' suggerisce di poter generalizzare liberamente su di esso (che non è vero, sempre a causa di '!'). –

risposta

2

Almeno a partire dal GHC 7.8, se si attiva il supporto GADT, quindi i vostri typechecks codice e fa quello che ci si aspetta:

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

conseguente:

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

Non funziona in GHC 7.6. – ThePiercingPrince

Problemi correlati