2010-10-22 2 views
7

La cabala mi sta dando messaggi misti. Quando dico:DeriveFunctor è un'estensione ben riconosciuta? La cabala sembra confusa

Extensions: DeriveFunctor 

Dice:

Warning: Unknown extensions: DeriveFunctor 

Ma quando dico:

GHC-Options: -XDeriveFunctor 

Dice:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions: 
DeriveFunctor' 

Per ora sto solo andando utilizzare il pragma {-# LANGUAGE DeriveFunctor #-}.

$ cabal --version 
cabal-install version 0.8.2 
using version 1.8.0.6 of the Cabal library 
$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 6.12.3 
$ basename $(mdfind haskell-platform | grep .dmg) 
haskell-platform-2010.2.0.0.i386.dmg 
+0

Quale versione di GHC o Haskell Platform usi> –

+0

Ulteriori informazioni sulla versione aggiunte. –

+0

Non so di questo avviso particolare, ma penso che l'aggiunta di un pragma LANGUAGE all'interno del file sia comunque l'opzione migliore. –

risposta

4

Secondo la Hackage documentation, come di Cabal-1.8.0.6 DeriveFunctor non è riconosciuto. È un'aggiunta relativamente nuova a GHC e non sembra avere largo uso, quindi non sono sorpreso che sarebbe stato trascurato per Cabal. Questo dovrebbe probabilmente essere archiviato come un bug (richiesta di funzionalità?) Contro Cabal.

@Tom Lokhorst ha ragione che un PRAGA LINGUA è l'opzione migliore. Non mi piace usare il campo delle estensioni di Cabal perché tutte le estensioni sono attive per tutti i moduli, cosa che spesso non desidero.

+1

OK L'ho segnalato: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

Grazie per aver inviato la segnalazione di errore; Ho aggiunto una patch. –

7

È ancora possibile utilizzare extensions: DeriveFunctor nel file .cabal. Sì, non è un'estensione che è attualmente nota a Cabal, ma è comunque possibile utilizzarla e finché il compilatore la riconosce funzionerà. Effettivamente Cabal controllerà che il compilatore riconosca l'estensione, anche se Cabal non ne è a conoscenza.

C'è un registro centrale delle estensioni nel modulo Language.Haskell.Extension. Lo scopo di questo registro è che diversi compilatori possono concordare gli stessi nomi quando implementano le stesse estensioni. Abbiamo avuto casi in passato in cui autori di diversi compilatori hanno accidentalmente dato nomi diversi allo stesso concetto di estensione. Non tutte le estensioni devono essere registrate. Ha senso non registrare estensioni che sono ancora altamente sperimentali, per esempio le estensioni DPH "PArr" non sono ancora registrate. Hackage richiede che tutti i pacchetti caricati utilizzino solo estensioni registrate note, il che ha senso poiché se un'estensione è sufficientemente pronta per essere utilizzata in un pacchetto distribuito, allora è ok registrarsi.

In questo caso particolare, gli sviluppatori GHC sembrano aver dimenticato di registrare l'estensione.

Vale anche la pena notare che a partire da Cabal-1.10 il campo extensions viene suddiviso in due: default-extensions e other-extensions. Questo risolve il problema che John sottolinea nella sua risposta, che il comportamento precedente è che tutte le estensioni sono attive per tutti i moduli, che riconosciamo essere un errore. Il campo other-extensions consente di elencare le estensioni utilizzate in alcuni moduli (vale a dire con il prefisso LANGUAGE). La Cabala finirà con il per far rispettare che sono tutti elencati, proprio come richiede che siano elencate tutte le dipendenze del pacchetto. Le dipendenze della lingua sono anche delle dipendenze.