2015-04-18 3 views
6

Я считаю себя, используя этот вид прагме много в моих Кабал проектов, чтобы заставить GHC строить с определенными параметрами:Haskell псевдокомментарии: OPTIONS_GHC против ЯЗЫКА

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

Но когда я вижу других людей с помощью расширений, они всегда объявить его следующим образом:

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

Однако, когда я загрузить файлы в GHCi, которые используют последний метод, GHC всегда жалуется, что я использую unrecognised pragma и быстро выходит из строя.

Почему GHC не принимает прагму LANGUAGE, а какая из двух лучше подходит?


Примечание: моя GHC версия уточненный: 7.8.3, но был 7,6 *, когда это произошло..

+0

Какая версия GHC? Может, у вас очень старый? Также будьте осторожны с использованием '#' как самого первого символа строки, когда включена CPP (в таких случаях перед этим добавьте пробел). – chi

+0

Длинный снимок, но какая версия GHC вы используете? (Запустите 'ghc --version' в своей оболочке, чтобы узнать.) –

+0

Любопытный. Вы можете показать весь файл, который дает эту ошибку? –

ответ

12

Использование LANGUAGE Прагма лучше. Вместо предоставления списка произвольных параметров он специфичен только для языковых расширений. Он также предназначен для переносимости между реализациями, как указано в документах GHC; LANGUAGE

... позволяет переносить языковые расширения переносным способом. Предполагается, что все компиляторы Haskell поддерживают прагму LANGUAGE с тем же синтаксисом, хотя не все расширения поддерживаются всеми компиляторами, конечно. Вместо OPTIONS_GHC следует использовать прагму LANGUAGE, если возможно. [курсив]

Этот же язык проявляется в документации на всем пути от GHC 6.6 (§7.10.4), когда LANGUAGE был введен, через GHC 7.10.1 (§7.22.1), текущей (на момент написания) выпуска.

Третий способ указания языковых расширений состоит в том, чтобы объявить их в файле cabal.

Я также считаю, что это общепринятая использовать LANGUAGE прагму объявить используемые расширения для одного файла, но с использованием OPTIONS_GHC (на уровне одного файла), как правило, используется в качестве обходного пути (например, отключить некоторые предупреждения). Люди предпочитают объявлять варианты GHC по всему проекту (с помощью cabal) не по отдельным файлам, тогда как по какой-то причине языковые расширения часто используются для каждого файла.

Вот несколько домыслов, почему LANGUAGE Прагма не может быть распознаны:

  • У вас есть древняя GHC версия (< 6.6)
  • Вы не объявите его как файл-заголовок прагма. Прагма заголовка файла должна предшествовать ключевому слову module в файле. Другими словами, он должен находиться в самом верху файла (хотя ему могут предшествовать другие прагмы заголовка файла)
+0

Если у кого-то есть больше догадок, почему прагма может быть не распознана, добавьте их в список (для будущих поколений) – zudov

+6

Причина, по которой расширения 'LANGUAGE' часто зашифровываются для каждого файла, заключается в том, чтобы кто-либо, читающий файл, знал, какие расширения находятся в играть. Очень хорошо знать, находятся ли в игре «GeneralizedNewtypeDeriving», «OverlappingInstances», «IncoherentInstances», «MonoLocalBinds», «ScopedTypeVariables», «DataKinds» и/или «PolyKinds», и они (по крайней мере) могут быть не полностью очевидно из остальной части источника. – dfeuer

Смежные вопросы