2010-10-22 3 views
7

Cabal gibt mir gemischte Nachrichten. Wenn ich sage:Ist DeriveFunctor eine bekannte Erweiterung? Cabal scheint verwirrt

Extensions: DeriveFunctor 

Dort heißt es:

Warning: Unknown extensions: DeriveFunctor 

Aber wenn ich sage:

GHC-Options: -XDeriveFunctor 

Dort heißt es:

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

Denn jetzt bin ich nur gehen das Pragma {-# LANGUAGE DeriveFunctor #-} zu verwenden.

$ 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

Für welche Version von GHC oder Haskell Platform verwenden Sie> –

+0

Weitere Informationen zur Version hinzugefügt. –

+0

Ich weiß nicht, über diese besondere Warnung, aber ich denke, Hinzufügen eines LANGUAGE Pragma in der Datei ist sowieso die beste Option. –

Antwort

4

Nach dem Hackage documentation, wie von Cabal-1.8.0.6 DeriveFunctor nicht erkannt. Es ist eine relativ neue Ergänzung zu GHC und es scheint nicht zu weit verbreitet zu sein, also bin ich nicht überrascht, dass es für Cabal übersehen worden wäre. Dies sollte wohl als Bug (Feature Request?) Gegen Cabal abgelegt werden.

@Tom Lokhorst hat Recht, dass ein LANGUAGE Pragma die beste Option ist. Ich mag es nicht, Cabals Extensions-Feld zu verwenden, da dann alle Erweiterungen für alle Module aktiv sind, was ich oft nicht will.

+1

OK Ich habe es gemeldet: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

Vielen Dank für das Einreichen des Fehlerberichts; Ich habe einen Patch hinzugefügt. –

7

Sie können immer noch extensions: DeriveFunctor in Ihrer .cabal-Datei verwenden. Ja, es ist keine Erweiterung, die derzeit Cabal bekannt ist, aber Sie können es immer noch verwenden, und solange der Compiler es erkennt, wird es funktionieren. In der Tat wird Cabal prüfen, ob der Compiler die Erweiterung erkennt, obwohl Cabal selbst nichts davon weiß.

Es gibt eine zentrale Registrierung von Erweiterungen im Modul Language.Haskell.Extension. Der Zweck dieser Registrierung besteht darin, dass verschiedene Compiler sich auf dieselben Namen einigen können, wenn sie dieselben Erweiterungen implementieren. Wir hatten Fälle in der Vergangenheit, in denen Autoren verschiedener Compiler versehentlich dem gleichen Erweiterungskonzept unterschiedliche Namen gegeben haben. Nicht alle Erweiterungen müssen registriert werden. Es macht Sinn, keine Erweiterungen zu registrieren, die noch sehr experimentell sind, zB die DPH-Erweiterungen "PArr" sind noch nicht registriert. Hackage erfordert, dass alle hochgeladenen Pakete nur bekannte registrierte Erweiterungen verwenden, was sinnvoll ist, da eine Erweiterung ausreichend für die Verwendung in einem verteilten Paket ist, dann ist es in Ordnung, sich zu registrieren.

In diesem speziellen Fall scheinen die GHC-Entwickler vergessen zu haben, die Erweiterung zu registrieren.

Es ist auch erwähnenswert, dass ab dem Cabal-1.10 das extensions Feld in zwei geteilt wird: default-extensions und other-extensions. Dies behebt das Problem, dass John in seiner Antwort darauf hinweist, dass das vorherige Verhalten darin besteht, dass alle Erweiterungen für alle Module aktiv sind, was wir als Fehler anerkennen. Das Feld other-extensions ermöglicht es, die in einigen Modulen verwendeten Erweiterungen (d. H. Das Pragma) aufzulisten. Cabal wird schließlich erzwingen, dass sie alle aufgelistet sind, genau wie es erfordert, dass alle Paketabhängigkeiten aufgeführt sind. Sprachabhängigkeiten sind ebenfalls Abhängigkeiten.

Verwandte Themen