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 thing
Bar
. ¿Hay alguna forma de que esto suceda sin exportar un thing
diferente?
Espera, ¿no habría un choque si el usuario importa ambos módulos? –
@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'. –
¡WOW! ¿Cuánto tiempo ha estado disponible esa función?! Esto cambia TODO. –