2010-10-22 7 views
7

Cabal me está dando mensajes contradictorios. Cuando digo:¿DeriveFunctor es una extensión bien reconocida? Cabal parece confundida

Extensions: DeriveFunctor 

Dice:

Warning: Unknown extensions: DeriveFunctor 

Pero cuando digo:

GHC-Options: -XDeriveFunctor 

Dice:

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

Por ahora sólo voy para 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 
+0

¿Qué versión de GHC o Haskell Platform está usando> –

+0

Se agregó más información de la versión. –

+0

No conozco esta advertencia en particular, pero creo que agregar un pragma de IDIOMA dentro del archivo es la mejor opción. –

Respuesta

4

Según la Hackage documentation, como de Cabal-1.8.0.6 DeriveFunctor no se reconoce. Es una adición relativamente nueva a GHC y no parece tener un amplio uso, así que no estoy sorprendido de que Cabal lo haya pasado por alto. Esto probablemente debería ser archivado como un error (¿solicitud de función?) Contra Cabal.

@Tom Lokhorst tiene razón en que LANGUAGE pragma es la mejor opción. No me gusta usar el campo Extensiones de Cabal porque todas las extensiones están activas para todos los módulos, lo que a menudo no quiero.

+1

OK Lo informé: http://hackage.haskell.org/trac/hackage/ticket/751 –

+1

Gracias por enviar el informe de fallas; He agregado un parche. –

7

Todavía puede usar extensions: DeriveFunctor en su archivo .cabal. Sí, no es una extensión conocida actualmente por Cabal, pero aún puede usarla y, siempre que el compilador la reconozca, funcionará. De hecho, Cabal verificará que el compilador reconozca la extensión, aunque Cabal no lo sepa.

Hay un registro central de extensiones en el módulo Language.Haskell.Extension. El objetivo de este registro es que los diferentes compiladores puedan ponerse de acuerdo sobre los mismos nombres cuando implementan las mismas extensiones. Hemos tenido casos en el pasado donde los autores de diferentes compiladores accidentalmente han dado diferentes nombres al mismo concepto de extensión. No todas las extensiones deben registrarse. Tiene sentido no registrar extensiones que todavía son muy experimentales, por ejemplo, las extensiones DPH "PArr" todavía no están registradas. Hackage requiere que todos los paquetes cargados utilicen solo extensiones registradas conocidas, lo cual tiene sentido ya que si una extensión está suficientemente lista para ser utilizada en un paquete distribuido, entonces es correcto registrarse.

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

También vale la pena señalar que a partir de Cabal-1.10 el campo extensions se divide en dos: default-extensions y other-extensions. Esto aborda el problema que John señala en su respuesta, que el comportamiento anterior es que todas las extensiones están activas para todos los módulos, lo que reconocemos es un error. El campo other-extensions permite enumerar las extensiones utilizadas en algunos módulos (es decir, con el pragma LANGUAGE). Cabal eventualmente impone que están todos en la lista, al igual que requiere que todas las dependencias del paquete estén en la lista. Las dependencias de lenguaje también son dependencias.