2010-12-08 4 views
24

nehme an, Sie zwei Module wieRe-Export qualifiziert?

module Foo.A where 

foo = 42 

und

module Foo.B where 

foo = 12 

und Sie wollen schreiben haben ein super Modul

module Foo (
     module Foo.A 
    , module Foo.B 
    ) where 

import Foo.A 
import Foo.B 

, die diese Module Reexporte, würden Sie einen Namen bekommen Zusammenstoß.

Gibt es dafür eine Lösung?

Antwort

24

Grundsätzlich keine. Dies ist eine seit langem bestehende Feature-Anfrage von Leuten wie den Autoren von Gtk2hs. Gtk2hs hat ein sehr breites Modulhierarchie, wo es sinnvoll, beide machen könnte:

  • Verwenden Sie den gleichen Namen in verschiedenen Modulen (zB NewButton sowohl Graphics.UI.Gtk.Buttons.Button und Graphics.UI.Gtk. Buttons.CheckButton)
  • Geben Sie die Bequemlichkeit für den Benutzer mit einem einzigen Import-Anweisung alle diese Module zu importieren

Für jetzt, wenn Sie mehrere Module zusammen alle reexport möchten, können Sie tun, ist:

  • Vermeiden Sie die Wiederverwendung von Namen in den Modulen wünschen Sie
  • Gegebenenfalls Verwendung Typklassen reexport den gleichen Namen zu ermöglichen, für verschiedene Zwecke
+13

Die Funktionsweise von Modulen ist wohl einer der schwächsten Punkte in Haskell. Sie lassen viel zu wünschen übrig, dieser Fall ist ein Beispiel. –

+1

Haben Sie zufällig eine Verknüpfung zu dieser Feature-Anfrage? – dfeuer

11

Gute Frage. Der Haskell Bericht addresses this:

Exporte Listen sind kumulativ: die Menge der durch eine Exportliste exportierten Einheiten ist die Vereinigung der von den einzelnen Posten der Liste exportierten Einheiten.

[...]

Die uneingeschränkten Namen der von einem Modul exportierten Einheiten müssen alle verschieden sein (in ihrem jeweiligen Namensraum).

Nach meinem begrenzten Haskell-Wissen würde ich sagen, dass es nicht möglich ist.

+0

Macht Sinn verwendet werden, danke. – LennyStackOverflow

Verwandte Themen