Pergunta

Cabala está me dando mensagens contraditórias. Quando eu digo:

Extensions: DeriveFunctor

Diz:

Warning: Unknown extensions: DeriveFunctor

Mas quando digo:

GHC-Options: -XDeriveFunctor

Diz:

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

Por enquanto, eu só vou usar o {-# LANGUAGE DeriveFunctor #-} Pragma.

$ 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
Foi útil?

Solução

De acordo com Documentação de hackage, a partir de Cabal-1.8.0.6 DeriveFunctor não é reconhecido. É uma adição relativamente nova ao GHC e não parece ter amplo uso, por isso não estou surpreso que teria sido esquecido para Cabal. Provavelmente, isso deve ser arquivado como um bug (solicitação de recurso?) Contra Cabal.

@Tom Lokhorst está certo de que um idioma Pragma é a melhor opção. Não gosto de usar o campo de extensões de Cabal, porque todas as extensões estão ativas para todos os módulos, o que eu geralmente não quero.

Outras dicas

Você ainda pode usar extensions: DeriveFunctor no seu arquivo .cabal. Sim, não é uma extensão que atualmente é conhecida por Cabal, mas você ainda pode usá -la e, desde que o compilador o reconheça, ele funcionará. De fato, Cabal verificará se o compilador reconhece a extensão, mesmo que Cabal não saiba.

Existe um registro central de extensões no módulo Language.Haskell.Extension. O objetivo deste registro é para que diferentes compiladores possam concordar com os mesmos nomes quando implementam as mesmas extensões. No passado, tivemos casos em que autores de diferentes compiladores deram nomes diferentes acidentalmente para o mesmo conceito de extensão. Nem todas as extensões precisam ser registradas. Faz sentido não registrar extensões que ainda são altamente experimentais, por exemplo, as extensões DPH "Parr" ainda não estão registradas. O hackage exige que todos os pacotes carregados usem apenas extensões registradas conhecidas, o que faz sentido, pois se uma extensão estiver suficientemente pronta para ser usada em um pacote distribuído, é bom se registrar.

Nesse caso em particular, os desenvolvedores de GHC parecem ter esquecido de registrar a extensão.

Também vale a pena notar que a partir de cabal-1.10 o extensions O campo está sendo dividido em dois: default-extensions e other-extensions. Isso aborda a questão que John aponta em sua resposta, que o comportamento anterior é que todas as extensões estão ativas para todos os módulos, que reconhecemos que é um erro. o other-extensions O campo permite as extensões usadas em alguns módulos (ou seja, com o LANGUAGE Pragma) a ser listado. Cabal eventualmente aplicar que todos estão listados, assim como exige que todas as dependências de pacotes estejam listadas. As dependências da linguagem também são dependências.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top