2010-10-22 3 views
7

Кабал дает мне смешанные сообщения. Когда я говорю:Является ли DeriveFunctor общепризнанным расширением? Кабаль кажется смущенным

Extensions: DeriveFunctor 

Он говорит:

Warning: Unknown extensions: DeriveFunctor 

Но когда я говорю:

GHC-Options: -XDeriveFunctor 

Он говорит:

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

На данный момент я просто хочу для использования прагмы {-# 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

В какой версии платформы GHC или Haskell вы используете> –

+0

Дополнительная информация о версии добавлена. –

+0

Я не знаю об этом конкретном предупреждении, но я думаю, что добавление прагмы LANGUAGE внутри файла - наилучший вариант. –

ответ

4

Согласно Hackage documentation, от Кабал-1.8.0.6 DeriveFunctor не распознается. Это относительно новое дополнение к GHC, и, похоже, оно не имеет широкого применения, поэтому я не удивлен, что он был бы упущен для Cabal. Вероятно, это должно быть подано как ошибка (запрос функции?) Против Cabal.

@Tom Lokhorst прав, что прагма LANGUAGE - лучший вариант. Мне не нравится использование расширения Cabal's Extensions, потому что тогда все расширения активны для всех модулей, чего я часто не хочу.

+1

OK Я сообщил об этом: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

Спасибо за отправку отчета об ошибке; Я добавил патч. –

7

Вы все еще можете использовать extensions: DeriveFunctor в своем .cabal файле. Да, это не расширение, которое в настоящее время известно Cabal, но вы все равно можете его использовать, и пока компилятор узнает его, он будет работать. Действительно, Cabal проверит, что компилятор распознает расширение, хотя Cabal сам не знает об этом.

В модуле Language.Haskell.Extension имеется центральный реестр расширений. Цель этого реестра состоит в том, чтобы разные компиляторы могли согласовать одни и те же имена при реализации тех же расширений. В прошлом у нас были случаи, когда авторы разных компиляторов случайно приводили разные имена к одной и той же концепции расширения. Не все расширения должны быть зарегистрированы. Имеет смысл не регистрировать расширения, которые все еще весьма экспериментальны, например расширения DPH «PArr» до сих пор не зарегистрированы. Hackage требует, чтобы все загруженные пакеты использовали только известные зарегистрированные расширения, что имеет смысл, поскольку, если расширение достаточно готово для использования в распределенном пакете, тогда это нормально для регистрации.

В этом конкретном случае разработчики GHC, похоже, забыли зарегистрировать расширение.

Следует также отметить, что по состоянию на Кабаль-1.10 поле extensions делится на два: default-extensions и other-extensions. Это касается вопроса, который Джон указывает в своем ответе, что предыдущее поведение состоит в том, что все расширения активны для всех модулей, которые, как мы признаем, являются ошибкой. Поле other-extensions позволяет перечислять расширения, используемые в некоторых модулях (т. Е. С праймой LANGUAGE). Cabal в конечном итоге введет в действие, что все они перечислены, так же как и все перечисленные зависимости пакетов. Языковые зависимости также зависят.