Ich bin auf einige Module gestoßen, die besonders merkwürdige Importe enthalten.
Zuerst habe ich ein Modul A
gesehen, das ein anderes Modul als sich selbst importiert. Zum Beispiel:
Was macht das? Warum ist das Obige überhaupt erlaubt?
Am meisten beunruhigt mich jedoch, dass der Code tatsächlich von dieser Art ist:
%Vor% Warum kann mehr als ein Modul mit demselben Namen importiert werden? Was erreicht das?
Ich dachte, dass diese Art von import
s nicht erlaubt war und auch Eine sanfte Einführung in Haskell gibt Folgendes an:
Es ist illegal, zwei verschiedene Entitäten mit demselben Namen zu importieren in den gleichen Umfang.
Aber diese Importe funktionieren gut. Eine andere seltsame Sache, die mich nervt, ist das Exportieren des Moduls selbst:
%Vor%Zusammenfassend, angesichts der folgenden MWE:
%Vor%A
? Namensbezeichner sind nicht dasselbe wie Modulnamen. Ein Namensqualifizierer ist nur ein kollektiver Bereich, Sie können ihn auf eine beliebige Anzahl von Modulen beziehen. Normalerweise werden Sie nicht mehr als eins hinzufügen, aber in einem Fall fügen Sie fast immer viele Module hinzu: im uneingeschränkten Bereich . import Data.List
könnte als etwas wie import qualified Data.List as ""
gelesen werden: es ordnet an, dass sortBy
gefunden wird, wenn es mit einem "leeren Qualifier" gemeint ist, d. h. mit keiner. Aber wir könnten diesen Geltungsbereich "umbenennen":
Die einzigen Qualifikationsmerkmale, die behoben werden, sind diejenigen, die spezifisch für das Modul in Ihrer Datei selbst sind: das ist immer sowohl im unqualifizierten Bereich als auch im Bereich, der automatisch nach dem Modul benannt wird. Und für Definitionen müssen Sie das nicht qualifizierte Formular verwenden.
Für module A (module A)
scheint das ziemlich falsch zu sein. Ich denke nicht, dass Modul-Exporte wirklich gut durchdacht sind. Sie funktionieren nur dann richtig, wenn Sie auf ein tatsächliches Modul verweisen, nicht nur auf einen Namensqualifizierer, d. H.
wird nicht funktionieren. Was Sie wundern lässt, warum es überhaupt erlaubt ist, solch einen Export zu deklarieren. Könnte wirklich ein Fehler hier sein.