haskell - data - ¿Qué es una alternativa a un preludio con las importaciones calificadas?
import data char haskell (2)
Una solución es definir la lista de importación en un encabezado de CPP.
NB : Esta respuesta es solo para mostrar lo que es técnicamente posible; La respuesta de Daniel Wagner es generalmente la mejor alternativa.
Para un ejemplo a nivel de paquete:
my-pkg/
my-pkg.cabal
include/imports.h
src/MyModule.hs
...
include/imports.h
:
import Control.Applicative
import Data.Maybe
import Data.Char
En my-pkg.cabal
, los componentes ( library
, executable
, test
, ...) tienen un campo de include-dirs
(que a su vez corresponde a alguna opción de GHC):
library
...
include-dirs: include
Luego puedes usar ese encabezado en cualquier módulo:
{-# LANGUAGE CPP #-}
module MyModule where
#include "imports.h"
-- your code here
mymaybe = maybe
Casi todos los módulos en nuestra base de código tienen importaciones tales como:
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
Me gustaría definir un preludio local para que Map
, Set
y Text
estén disponibles para los módulos que importan ese preludio. Aparentemente no hay manera de hacer eso en Haskell . Así que me pregunto cómo resuelven las personas este problema en grandes bases de código Haskell.
Voy a responder a esta pregunta, interpretada tan literalmente como sea posible:
¿Cómo resuelven las personas este problema en grandes bases de código Haskell?
Respuesta: escriben
import qualified Data.Map as Map
import qualified Data.Set as Set
import qualified Data.Text as Text
en la parte superior de cada módulo que necesita Map
, Set
y Text
.
En mi experiencia, administrar importaciones no es una parte importante de la dificultad de trabajar con grandes bases de código. El esfuerzo de saltar a la lista de importación y agregar una línea para Data.Map
cuando descubra que la necesita está absolutamente abrumado por el esfuerzo de encontrar el lugar correcto en la base de código para hacer cambios, sabiendo toda la amplitud de la base de código para que no No duplique esfuerzos y encuentre formas de probar pequeños trozos de una aplicación grande en forma aislada.
En comparación con la alternativa propuesta en la otra respuesta (CPP), de esta manera también tiene algunas ventajas técnicas:
- Menos tiempo de espera del proyecto. Cuantas menos sorpresas haya para los humanos que se unen a tu proyecto, más rápido podrán ponerse en marcha y ser útiles de forma independiente.
- Mejor soporte de herramientas. Si veo
Foo.bar
como un identificador en algún lugar, puedo usar la búsqueda deFoo.bar
mi editor de texto para averiguar qué línea de importación hizo que el espacio de nombres deFoo
esté disponible sin adiciones sofisticadas para incluir archivos#include
d. Si quiero encontrar todos los archivos que dependen deSome.Fancy.Module
, puedo aprenderlo al grepping paraSome.Fancy.Module
. Los sistemas de compilación que no cambian la detección no necesitan conocer el archivo.h
adicional al calcular qué archivos ver. Etcétera. - Menos reconstrucciones espurias. Si tiene más importaciones de las que realmente usa, esto puede hacer que GHC reconstruya su módulo incluso cuando no sea necesario reconstruirlo.