data haskell module

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 de Foo.bar mi editor de texto para averiguar qué línea de importación hizo que el espacio de nombres de Foo esté disponible sin adiciones sofisticadas para incluir archivos #include d. Si quiero encontrar todos los archivos que dependen de Some.Fancy.Module , puedo aprenderlo al grepping para Some.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.