Является ли 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
2 ответа
Согласно документации Hackage, начиная с Cabal-1.8.0.6 DeriveFunctor
не признается Это относительно новое дополнение к GHC, и, похоже, оно не имеет широкого применения, поэтому я не удивлен, что это упустили бы из-за Cabal. Вероятно, это должно быть подано как ошибка (запрос функции?) Против Cabal.
@ Том Локхорст прав, что прагма ЯЗЫК - лучший вариант. Мне не нравится использовать поле расширений Cabal, потому что тогда все расширения активны для всех модулей, которые я часто не хочу.
Вы все еще можете использовать extensions: DeriveFunctor
в вашем файле.cabal. Да, это не расширение, которое в настоящее время известно Cabal, но вы все равно можете использовать его, и пока компилятор распознает его, оно будет работать. Действительно, Cabal проверит, что компилятор распознает расширение, даже если Cabal сам не знает об этом.
В модуле есть центральный реестр расширений. Language.Haskell.Extension
, Цель этого реестра состоит в том, чтобы разные компиляторы могли согласовывать одни и те же имена, когда они реализуют одни и те же расширения. В прошлом были случаи, когда авторы разных компиляторов случайно давали разные имена одной и той же концепции расширения. Не все расширения должны быть зарегистрированы. Имеет смысл не регистрировать расширения, которые все еще являются экспериментальными, например, расширения DPH "PArr" все еще не зарегистрированы. Hackage требует, чтобы во всех загруженных пакетах использовались только известные зарегистрированные расширения, что имеет смысл, поскольку, если расширение достаточно готово для использования в распределенном пакете, регистрация возможна.
В этом конкретном случае разработчики GHC, похоже, забыли зарегистрировать расширение.
Стоит также отметить, что с Cabal-1.10 extensions
поле делится на две части: default-extensions
а также other-extensions
, Это решает проблему, на которую Джон указывает в своем ответе, что предыдущее поведение заключается в том, что все расширения активны для всех модулей, что мы признаем ошибкой. other-extensions
поле позволяет расширения, используемые в некоторых модулях (то есть с LANGUAGE
прагма) быть в списке. Cabal в конечном итоге обеспечит, чтобы все они были перечислены, точно так же, как это требует, чтобы все зависимости пакетов были перечислены. Языковые зависимости тоже являются зависимостями.