es Angenommen ist ein Bibliotheksmodul Foo
, die nicht unter meiner Kontrolle ist:Kontrolle dokumentiert Typ Unterschrift reexportiert Funktion
module Foo (Foo, thing) where
data Foo = Foo Int
thing :: Foo
thing = Foo 3
Jetzt nehme ich an meine eigene Bibliothek-Modul haben, die Reexporte thing
vom Foo
Modul.
module Bar (Foo.thing, getBar) where
import qualified Foo
type Bar = Foo.Foo
getBar :: Bar -> Int
getBar (Foo i) = i
Aus Kompatibilitätsgründen ich nicht eine andere thing
exportieren möchten. Ich möchte sicherstellen, dass ich Foo.thing
exportieren, so dass, wenn der Benutzer sowohl die Module Foo
und Bar
importiert, erhalten sie die gleiche thing
und es wird kein Name Konflikt sein.
Angenommen, wir haben ein drittes Modul, das Bar
verwendet.
module Main where
import Bar
Laden wir die dritte in 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
Statt GHCI und die Haddocks darauf hinweist, dass thing
in Modul Bar
Typ Foo.Foo
hat, würde ich es gerne sagen, dass thing
Bar
Typ hat. Gibt es eine Möglichkeit, dies zu erreichen, ohne einen anderen thing
zu exportieren?
Warte, würde es keinen Konflikt geben, wenn der Benutzer beide Module importiert? –
@GabrielGonzalez versuche, der dritten Datei 'import Foo' hinzuzufügen und sieh selbst! (Es gibt keinen Konflikt, da beide * das gleiche 'Ding' exportieren.) Für den Fall, dass beide importiert werden, möchte ich * ghci immer noch sagen, dass sie 'Bar' gegenüber' Foo' bevorzugen soll. –
WOW! Wie lange ist diese Funktion verfügbar?!!?! Das ändert ALLES. –