2010-10-22 23 views
7

La cabale me donne des messages contradictoires. Quand je dis:DeriveFunctor est-il une extension reconnue? La cabale semble confuse

Extensions: DeriveFunctor 

Il dit:

Warning: Unknown extensions: DeriveFunctor 

Mais quand je dis:

GHC-Options: -XDeriveFunctor 

Il dit:

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

Pour l'instant je vais juste pour utiliser le 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

Quelle version de la plate-forme GHC ou Haskell utilisez-vous?> –

+0

Plus d'informations sur la version ajoutée. –

+0

Je ne connais pas cet avertissement particulier, mais je pense que l'ajout d'un pragma LANGUAGE dans le fichier est la meilleure option de toute façon. –

Répondre

4

Selon le Hackage documentation, comme Cabal-1.8.0.6 DeriveFunctor n'est pas reconnu. C'est un ajout relativement nouveau à GHC et il ne semble pas avoir une large utilisation, donc je ne suis pas surpris qu'il aurait été négligé pour Cabal. Cela devrait probablement être classé comme un bug (demande de fonctionnalité?) Contre Cabal.

@Tom Lokhorst a raison de dire qu'un pragma LANGUAGE est la meilleure option. Je n'aime pas utiliser le champ Extensions de Cabal parce que toutes les extensions sont actives pour tous les modules, ce que je ne veux pas souvent.

+1

OK Je l'ai signalé: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

Merci d'avoir soumis le rapport de bogue; J'ai ajouté un patch. –

7

Vous pouvez toujours utiliser extensions: DeriveFunctor dans votre fichier .cabal. Oui, ce n'est pas une extension actuellement connue de Cabal, mais vous pouvez toujours l'utiliser et tant que le compilateur le reconnaîtra, cela fonctionnera. En effet, Cabal vérifiera que le compilateur reconnaît bien l'extension, même si Cabal n'en sait rien.

Il existe un registre central des extensions dans le module Language.Haskell.Extension. Le but de ce registre est de permettre aux différents compilateurs de s'accorder sur les mêmes noms lorsqu'ils implémentent les mêmes extensions. Nous avons eu des cas dans le passé où les auteurs de différents compilateurs ont accidentellement donné des noms différents au même concept d'extension. Toutes les extensions ne doivent pas être enregistrées. Il est logique de ne pas enregistrer les extensions qui sont encore très expérimentales, par exemple les extensions DPH "PArr" ne sont toujours pas enregistrées. Hackage exige que tous les paquets téléchargés n'utilisent que des extensions enregistrées connues, ce qui est logique car si une extension est suffisamment prête à être utilisée dans un paquet distribué, alors il est autorisé de s'enregistrer.

Dans ce cas particulier, les développeurs GHC semblent avoir oublié d'enregistrer l'extension.

Il convient également de noter qu'à partir de Cabal-1.10, le champ extensions est divisé en deux: default-extensions et other-extensions. Cela résout le problème que John souligne dans sa réponse, que le comportement précédent est que toutes les extensions sont actives pour tous les modules, ce que nous reconnaissons comme une erreur. Le champ other-extensions permet de répertorier les extensions utilisées dans certains modules (c'est-à-dire avec le pragma LANGUAGE). Cabal finira par appliquer qu'ils sont tous listés, tout comme il exige que toutes les dépendances de paquet soient listées. Les dépendances de langue sont aussi des dépendances.