data haskell module

haskell - data - GHC se niega a exportar módulos calificados



instance haskell (2)

Quiero escribir un módulo que vuelva a exportar algún módulo que haya importado calificado. Algo como esto:

module Foo.A ( module Foo.B , module Foo.C ) where import qualified Foo.B import qualified Foo.C -- bunch of code using Foo.B and Foo.C here

Esto parece que debería funcionar; Sin embargo, GHC imprime advertencias sobre las exportaciones:

Foo/A.hs:2:5: Warning: the export item `module Foo.B'' exports nothing Foo/A.hs:3:5: Warning: the export item `module Foo.C'' exports nothing

Y GHCI se niega a cargar las exportaciones de ellos.

Puedo resolver esto haciendo que las importaciones no sean calificadas, pero es probable que surjan conflictos de nombres entre esas importaciones y el código del módulo principal.

¿Hay alguna manera de hacer que GHC exporte estos módulos?


Esta limitación también es conveniente cuando el módulo de importación está destinado a volver a declarar algunos nombres en el módulo importado, basándose en las declaraciones de una importación calificada. Por ejemplo:

module MyPrelude (succ, module Prelude) where import qualified Prelude as P (succ) import Prelude hiding (succ) succ :: ... succ = ... P.succ ...

este idioma sería muy difícil de expresar sin mucha verbosidad de lo contrario. Además, pregúntese "¿tendría sentido esto sin los módulos jerárquicos?". Si no, entonces esto es muy específico de ghc, y lo que realmente sucede cuando se hace referencia a un nombre de módulo jerárquico desde una expresión no es jerárquico en absoluto.

En cuanto a por qué puede reexportar los símbolos individuales calificados por algún nombre de módulo que no importó, parece un truco para hacer que los módulos jerárquicos funcionen de forma jerárquica en ghc. Ganar símbolos calificados por Foo.B al importar Foo.A es mágico, y creo que es porque el nombre Foo no es más un ancestro hereditario real que Foo.A, pero el uso previsto de exportar cosas con una calificación alternativa es en los casos en que se usa de Foo. No creo que este comportamiento tenga sentido en absoluto sin las extensiones de GHC, por lo que voy a suponer que es específico de GHC.


No, eso no es solo una limitación de GHC, es la forma en que la importación y exportación está diseñada para funcionar en Haskell.

Un módulo solo tiene control de su propio espacio de nombres, no puede afectar lo que las personas pueden ver desde otros espacios de nombres. Un módulo "reexportar" es solo una abreviatura de "exportar todos los símbolos en mi propio espacio de nombres que se importaron aquí desde ese otro módulo". Pero los símbolos que importó no están realmente en su propio espacio de nombres.

Si desea exportar dos símbolos diferentes que tienen el mismo nombre, no podrá hacerlo desde un módulo. Divida el módulo en dos y exporte cada versión desde un módulo diferente.