2012-01-19 11 views
11

Tengo un proyecto Haskell que regularmente usa muchas funciones de idioma, y ​​quiero que el bloque de extensión de idioma para cada archivo fuente sea el mismo. He aquí una lista,haskell - ¿alguna forma de hacer rodar su propio grupo de pragmas de IDIOMA?

{-# LANGUAGE Arrows, 
      BangPatterns, 
      DefaultSignatures, 
      DeriveDataTypeable, 
      DeriveFunctor, 
      EmptyDataDecls, 
      FlexibleContexts, 
      FlexibleInstances, 
      FunctionalDependencies, 
      GADTs, 
      GeneralizedNewtypeDeriving, 
      MultiParamTypeClasses, 
      NamedFieldPuns, 
      NoImplicitPrelude, 
      NoMonomorphismRestriction, 
      OverlappingInstances, 
      RankNTypes, 
      RebindableSyntax, 
      ScopedTypeVariables, 
      StandaloneDeriving, 
      TemplateHaskell, 
      TypeFamilies, 
      TypeOperators, 
      TypeSynonymInstances, 
      UndecidableInstances, 
      ViewPatterns #-} 

Tal vez para algunos es una mala práctica, pero considero extensiones de lenguaje para ser parte de la "Haskell +" que yo suelo escribir código. Y, quiero que para ser los mismos módulos de ancho. Por ejemplo, el NoImplicitPrelude cambia el idioma dramáticamente, y quiero que sea uniforme para todos los módulos.

Pregunta: ¿Cómo puedo lograr esto, sin copiar y pegar el bloque de idioma en cada archivo? Se vuelve molesto cómo a menudo aprendo una nueva función de idioma, la agrego al módulo A, luego comienzo a trabajar en el módulo B, y me doy cuenta de que tengo que copiar el bloque de idioma del módulo A.

Para su información el CPP pragma con un #include hace no hacer el truco! Gracias por adelantado.

+0

pre pregunta relacionada con el tema aquí: http://stackoverflow.com/questions/6005382/haskell-ways-to-have-a-clean-import-block-re-exporting-modules-multiple-im – gatoatigrado

+2

Sugeriría encarecidamente que no incluya ' OverlappingInstances' en su lista de extensiones predeterminadas. – ehird

+0

@ehird, buen punto; sin embargo, se usa ocasionalmente. – gatoatigrado

Respuesta

14

Uso Cabal como su sistema de construcción, y la lista de las extensiones de lenguaje que desee en el campo de la sección Library o Executable de su archivo project.cabalExtensions. A continuación, elimine el bloque LANGUAGE de sus archivos fuente Haskell.

Consulte Cabal User Guide, incluido el tercer párrafo de la introducción.


Ghci es donde todo se cae. Se habla de agregar un comando cabal ghci, pero mientras tanto es un poco asqueroso.

Si su proyecto es una biblioteca, puede ejecutar ghci -package-conf dist/package.conf.inplace.

Si desea cargar módulos no expuestas en ghci, me defino una bandera "modo de desarrollo" en su project.cabal:

Flag development 
    Description:   Development mode: expose all modules, enable warnings. 
    Default:    False 

... condicionalmente exponer módulos adicionales en el modo de desarrollo:

Library 
    Exposed-modules:  My.Module, My.Module.Extra 
    if flag(development) 
    Exposed-modules: My.Module.Hidden, My.Module.Secret 
    GHC-Options:  -Wall 
    -- plus your extensions, etc 

... y habilitar explícitamente el modo de desarrollo cuando se ejecuta cabal configure:

$ cabal configure -f development 
+0

Se ve bien. Solo una pregunta: ¿cómo uso ghci? (preferiblemente en cualquier módulo del proyecto; no quiero editar el archivo cabal todas las veces) – gatoatigrado

+1

Ver mi edición. ¿Entendí correctamente tu punto sobre no querer editar el archivo cabal cada vez? – dave4420

+0

Perdón por no estar claro. Las modificaciones son definitivamente útiles, pero creo que no es lo que estoy buscando. Supongamos que estoy trabajando en el módulo 'A'. Entonces, sin camarilla, puedo escribir 'ghci A', e intentará cargar. Puedo recargar con ': r', hasta que funcione, y luego procedo a trabajar en el módulo' B', escribiendo ': l B' (o saliendo y ejecutando' ghci B'). – gatoatigrado

Cuestiones relacionadas