2015-04-18 3 views
6

Je me retrouve avec ce genre de pragma beaucoup dans mes projets de cabale pour forcer GHC à construire avec des options spécifiques:Haskell pragma: OPTIONS_GHC vs LANGUE

{-# OPTIONS_GHC -XFlexibleInstances -XRankNTypes ... #-} 

Mais quand je vois d'autres personnes qui utilisent extentions, ils ont toujours déclarer ainsi:

{-# LANGUAGE FlexibleInstances, RankNTypes, ... #-} 

Cependant, lorsque je charge les fichiers GHCi qui utilisent la dernière méthode, GHC se plaint toujours que j'utilise un unrecognised pragma et ne parvient pas rapidement.

Pourquoi GHC n'accepte-t-il pas le pragma LANGUAGE, et lequel des deux est le meilleur?


Note: ma version GHC est mise à jour: 7.8.3, mais était de 7,6 * quand cela se produisait..

+0

Quelle version de GHC? Peut-être en avez-vous un très ancien? Méfiez-vous également d'utiliser un «#» comme premier caractère d'une ligne lorsque le CPP est activé (dans ce cas, ajoutez un espace avant cela). – chi

+0

Long shot, mais quelle version de GHC utilisez-vous? (Exécutez 'ghc --version' dans votre shell pour le savoir. –

+0

Curieux. Pouvez-vous montrer un fichier entier qui donne cette erreur? –

Répondre

12

L'utilisation du LANGUAGE pragma est plus agréable. Au lieu de donner une liste d'options arbitraires, il est spécifique uniquement aux extensions de langue. Il est également conçu pour être portable entre les implémentations, comme mentionné dans les docs de GHC; LANGUAGE

... permet aux extensions de langage d'être activées de manière portable. Il est prévu que tous les compilateurs Haskell supportent le pragma LANGUAGE avec la même syntaxe, bien que toutes les extensions ne soient pas supportées par tous les compilateurs, bien sûr. Le pragma LANGUAGE doit être utilisé au lieu de OPTIONS_GHC, si possible. [Je souligne]

Cette même langue apparaît dans les docs tout le chemin de GHC 6.6 (§7.10.4), quand LANGUAGE a été introduit, à travers GHC 7.10.1 (§7.22.1), la version actuelle (au moment de la rédaction). Une troisième façon de spécifier les extensions de langage consisterait à les déclarer dans le fichier CABAL.

Je trouve aussi qu'il est courant d'utiliser LANGUAGE pragma pour déclarer les extensions utilisées pour un seul fichier, mais en utilisant OPTIONS_GHC (à un niveau de fichier unique) est généralement utilisé comme une solution de contournement (par exemple pour désactiver certains avertissements). Les utilisateurs préfèrent déclarer les options GHC à l'échelle du projet (avec cabal) et non sur des fichiers individuels, alors que, pour une raison quelconque, les extensions de langage sont souvent utilisées par fichier.

Voici quelques vagues suppositions pourquoi le LANGUAGE pragma pourrait ne pas être reconnus:

  • Vous avez une ancienne Version GHC (< 6,6)
  • vous ne déclarez pas comme un fichier en-tête pragma. Un pragma d'en-tête de fichier doit précéder le mot-clé module dans le fichier. En d'autres termes, il devrait être tout en haut du fichier (bien qu'il puisse être précédé par d'autres pragmas d'en-tête de fichier)
+0

Si quelqu'un a plus de devinettes pourquoi le pragma pourrait ne pas être reconnu, veuillez les ajouter à la liste (pour les générations futures) – zudov

+6

La raison pour laquelle les extensions LANGUAGE sont souvent par fichier est de s'assurer que toute personne lisant le fichier sait quelles sont les extensions jouer. Il est très bon de savoir si 'GeneralizedNewtypeDeriving',' OverlappingInstances', 'IncoherentInstances',' MonoLocalBinds', 'ScopedTypeVariables',' DataKinds', et/ou 'PolyKinds' sont en jeu, et ceux-ci (au moins) peuvent ne pas être entièrement évident du reste de la source. – dfeuer