2012-08-24 8 views
5

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 thingBar Typ hat. Gibt es eine Möglichkeit, dies zu erreichen, ohne einen anderen thing zu exportieren?

+0

Warte, würde es keinen Konflikt geben, wenn der Benutzer beide Module importiert? –

+0

@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. –

+0

WOW! Wie lange ist diese Funktion verfügbar?!!?! Das ändert ALLES. –

Antwort

0

Sofern ich nicht Beweise für das Gegenteil höre, scheint die Antwort zu sein: können Sie nicht.

Verwandte Themen