2012-08-24 12 views
5

Supongamos que hay un módulo de biblioteca Foo que no está bajo mi control:control documentado tipo de firma de la re-exportados función

module Foo (Foo, thing) where 
data Foo = Foo Int 
thing :: Foo 
thing = Foo 3 

Ahora supongamos que tengo mi propio módulo de biblioteca, que re-exportaciones thing del Foo módulo.

module Bar (Foo.thing, getBar) where 
import qualified Foo 
type Bar = Foo.Foo 
getBar :: Bar -> Int 
getBar (Foo i) = i 

Por razones de compatibilidad, yo no desee exportar una diferente thing. Quiero asegurarme de exportar Foo.thing, de modo que si el usuario importa los módulos Foo y Bar, obtendrán el mismo thing y no habrá un choque de nombre.

Ahora supongamos que tenemos un tercer módulo que usa Bar.

module Main where 
import Bar 

Carguemos el tercero en ghci.

[1 of 3] Compiling Foo    (Foo.hs, interpreted) 
[2 of 3] Compiling Bar    (Bar.hs, interpreted) 
[3 of 3] Compiling Main    (test.hs, interpreted) 
Ok, modules loaded: Main, Bar, Foo. 
ghci> :t thing 
thing :: Foo.Foo 
ghci> :t getBar 
getBar :: Bar -> Int 
ghci> getBar thing 
3 
ghci> :info Bar 
type Bar = Foo.Foo -- Defined at Bar.hs:3:6-8 

En lugar de ghci y los abadejos que indican que thing en el módulo Bar tiene tipo Foo.Foo, me gustaría que decir que tiene el tipo thingBar. ¿Hay alguna forma de que esto suceda sin exportar un thing diferente?

+0

Espera, ¿no habría un choque si el usuario importa ambos módulos? –

+0

@GabrielGonzalez intente agregar 'import Foo' al tercer archivo, ¡y compruébelo usted mismo! (No hay un conflicto ya que ambos exportan * lo mismo * 'cosa '). En el caso de que ambos sean importados, * aún * me gustaría decirle a ghci que prefiera' Bar' sobre 'Foo'. –

+0

¡WOW! ¿Cuánto tiempo ha estado disponible esa función?! Esto cambia TODO. –

Respuesta

0

A menos que escuche evidencia de lo contrario, la respuesta parece ser: no se puede.

Cuestiones relacionadas