2015-09-28 19 views
9

Oggi ho iniziato a conoscere GADTs da: haskell.org e https://wiki.haskell.orgCome autorizzi i GADT in Haskell?

Purtroppo, non so come usarli. Se corro il codice dall'esempio ricevo il seguente errore:

[1 of 1] Compiling Main    (test.hs, interpreted) 

AFP_229.hs:31:1: 
Illegal generalised algebraic data declaration for `Term' 
    (Use GADTs to allow GADTs) 
In the data declaration for `Term' 
Failed, modules loaded: none. 
Prelude> 

Questo è il codice che sto usando:

data Term a where 
    Lit :: Int -> Term Int 
    Succ :: Term Int -> Term Int 
    IsZero :: Term Int -> Term Bool 
    If  :: Term Bool -> Term a -> Term a -> Term a 
    Pair :: Term a -> Term b -> Term (a,b) 

Ho provato altri codice di esempio, ma questo mi dà lo stesso errore . Come autorizzi i GADT?

+2

Utilizzare un'opzione del compilatore o un pragma. https://downloads.haskell.org/~ghc/7.8.2/docs/html/users_guide/ghc-language-features.html#options-language –

risposta

10

Il Use GADTS to allow GADTS sembra selvaggio :)

Fondamentalmente ci sono due modi per attivare le estensioni di linguaggio:

  • percorso un -X<extensions>-ghc, per esempio ghc -XGADTS

  • inserire {-# LANGUAGE <extension> #-} nella parte superiore di un file, ad es. {-# LANGUAGE GADTs #-}

Inizialmente i messaggi di errore sembrava che: Use -XGADTs to allow GADTs, ma in realtà pragma lingua (il secondo modo) è più comune, e la gente ha cominciato a lamentarsi che è difficile da copiare-n-incolla nome dell'interno dall'errore messaggio, quindi -X è stato eliminato.

+8

L'approccio '{- # LANGUAGE GADTs # -}' è praticamente sempre la strada da percorrere, perché permette alle persone che leggono la fonte di vedere immediatamente quali estensioni sono in gioco. – dfeuer

+0

@dfeuer Sono d'accordo. In realtà è per questo che è più comune. – Yuras

+0

Grazie per il vostro aiuto. – maffh