Mi sono imbattuto in alcuni moduli che contengono importazioni particolarmente strane.Perché questi casi d'angolo nel lavoro di importazione di Haskell e come funzionano?
Prima di tutto, ho visto un modulo A
che importa un altro modulo come se stesso. Ad esempio:
-- module A.hs
module A where
import B as A -- ???
f = id
Cosa fa? Perché questo è consentito a tutti?
Tuttavia ciò che più guai me è che il codice è in realtà di questo tipo:
module A where
import B as A -- Okay, assume this works...
import C as A -- ??? A is already defined!
f = id
Perché può più di un modulo essere importati con lo stesso nome? Cosa ottiene? Ho pensato che questo tipo di import
s non è stato permesso e anche A Gentle Introduction to Haskell afferma che:
è illegale importare due entità diverse che hanno lo stesso nome nello stesso ambito.
Tuttavia queste importazioni funzionano correttamente. Ancora un altra cosa strana che mi bug sta esportando il modulo stesso:
module A (module A) where
In sintesi, data la seguente MWE:
-- A.hs
module A (module A) where
import B as A
import C as A
f = id
-- B.hs
module B where
g = id
-- C.hs
module C where
h = id
- Sono le importazioni seguendo gli standard o si tratta di alcuni bug di GHC? Non sembra un bug, ma non riesco a trovare alcun riferimento che spieghi tutti questi casi angolari.
- Qual è il risultato esatto raggiunto? Voglio dire: quali nomi sono importati e/o esportati da
A
?
Non ho mai visto esportare il modulo da solo; Interessante. Tutti gli altri casi, i nomi nelle diverse importazioni sono uniti. Per esempio. 1o esempio: A.somethingInB si riferisce alla versione di B, ma A.f si riferisce alla versione di A (a meno che B non definisca anche f, allora si tratta di un errore di ambiguità). Fortunatamente, questo è chiaramente comprensibile :-) – luqui