2010-07-08 11 views
18

Quiero escribir un módulo que reexporte algún módulo que haya importado calificado. Algo como esto:GHC se niega a exportar los módulos calificados

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 exportaciones de ellos.

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

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

Respuesta

12

No, eso no es sólo una limitación de GHC, que es la forma en la importación y exportación está diseñado para trabajar en Haskell.

Un módulo solo tiene control de su propio espacio de nombres - no puede afectar lo que la gente puede ver desde otros espacios de nombres. Un módulo "reexportación" es solo una abreviatura para decir "exportar todos los de los símbolos en mi propio espacio de nombres que haya tenido importados aquí desde ese otro módulo". Pero los símbolos que importó calificados no están realmente en su propio espacio de nombre .

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

+4

Pero es posible volver a exportar símbolos calificados; por ejemplo, 'importación calificada Foo.B' me permitirá hacer' módulo Foo.A (Foo.B.sym) '. ¿Por qué no es esto posible con los módulos? No estoy exportando dos símbolos con el mismo nombre; cualquier cosa conflictiva es interna al módulo. –

6

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, en función de 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 realmente difícil de expresar sin mucha verborrea de lo contrario. Además, pregúntate "¿tendría sentido esto sin módulos jerárquicos?". De lo contrario, esto es muy específico de ghc, y lo que realmente está sucediendo 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 símbolos individuales calificados por algún nombre de módulo que no haya importado, parece una dificultad para que los módulos jerárquicos funcionen de forma heiránica en ghc. Adquirir símbolos calificados Foo.B al importar Foo.A es mágico, y creo que es porque el nombre Foo no es más un antepasado heiránico real que Foo.A, pero el uso previsto de exportar cosas con calificación alternativa es en casos donde se usa de Foo. No creo que este comportamiento tenga sentido en absoluto sin las extensiones de GHC, así que voy a suponer que es un GHC específico.

Cuestiones relacionadas