Warum sind diese Eckfälle in Haskells Import-As-Arbeit und was machen sie?

8

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:

%Vor%

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%
  1. Folgen die Importe den Standards oder ist das ein Fehler von GHC? Es sieht nicht wie ein Fehler aus, aber ich kann keine Referenz finden, die all diese Fälle erklärt.
  2. Was ist das genaue Ergebnis? Ich meine: welche Namen werden importiert und / oder exportiert von A ?
Bakuriu 02.05.2014, 08:54
quelle

1 Antwort

6

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":

%Vor%

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.

%Vor%

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.

    
leftaroundabout 02.05.2014, 09:48
quelle

Tags und Links