Pregunta

Cabal me está dando mensajes contradictorios. Cuando digo:

Extensions: DeriveFunctor

Se dice:

Warning: Unknown extensions: DeriveFunctor

Pero cuando digo:

GHC-Options: -XDeriveFunctor

Se dice:

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

Por ahora sólo voy a usar el pragma {-# 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
¿Fue útil?

Solución

De acuerdo con la Hackage documentación , a partir de Cabal-1.8.0.6 DeriveFunctor no se reconoce. Es una relativamente nueva adición a GHC y no parecen tener un amplio uso, así que no me sorprende que habría sido pasado por alto por Cabal. Esto probablemente se debe presentar como un error (solicitud de función?) Contra Cabal.

@ Tom Lokhorst es justo que un pragma El lenguaje es la mejor opción. No me gusta el uso de extensiones de campo de Cabal porque entonces todas las extensiones están activos para todos los módulos, que a menudo no quieren.

Otros consejos

Puede seguir utilizando extensions: DeriveFunctor en su archivo .cabal. Sí, no es una extensión que se conoce actualmente a Cabal, pero todavía se puede utilizar y el tiempo que el compilador reconoce que entonces todo funcionará bien. De hecho Cabal comprobará que el compilador reconoce la extensión, a pesar de que no es en sí Cabal hace saber al respecto.

Hay un registro central de extensiones en el Language.Haskell.Extension módulo. El objetivo de este registro es para que los distintos compiladores pueden ponerse de acuerdo sobre los mismos nombres cuando aplican las mismas extensiones. Hemos tenido casos en el pasado donde autores de diferentes compiladores han dado accidentalmente diferentes nombres para el mismo concepto de extensión. No todas las extensiones deben ser registrados. Tiene sentido de no registrar extensiones que están todavía muy experimental, por ejemplo, las extensiones del DPH "Parr" todavía no está registrado. Hackage requiere que todos los paquetes cargados de usar extensiones registradas sólo se conoce, lo cual tiene sentido ya que si una extensión es lo suficientemente listo para ser utilizado en un paquete distribuido, entonces está bien para registrarse.

En este caso particular, los desarrolladores de GHC parecen haber olvidado para registrar la extensión.

También vale la pena señalar que a partir de Cabal-1.10 extensions el campo se ha dividido en dos: default-extensions y other-extensions. Este aborda la cuestión de que Juan señala en su respuesta, que el comportamiento anterior es que todas las extensiones están activos para todos los módulos, que reconocemos es un error. El campo other-extensions permite que las extensiones usadas en algunos módulos (es decir, con el pragma LANGUAGE) para ser enumeradas. Cabal con el tiempo cumplir que todos están en la lista, al igual que requiere que todas las dependencias del paquete se enumeran. dependencias de idiomas son dependencias también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top