2015-01-23 10 views
8

Per esercitarsi, sto implementando un tipo di dati di coda in un modulo chiamato "Queue". Il mio tipo di dati è chiamato anche "coda", come è il suo unico costruttore valore:Perché sono in grado di utilizzare il mio costruttore di valori anche se non lo esporto?

module Queue (Queue, enq, emptyQueue) where 

data Queue a = Queue { 
    inbox :: [a], 
    outbox :: [a] 
} deriving (Eq, Show) 

emptyQueue :: Queue a 
emptyQueue = Queue [] [] 

enq :: a -> Queue a -> Queue a 
enq x (Queue inb out) = Queue (x:inb) out 

-- other function definitions (irrelevant here)... 

Per quanto ho capito, perché ho scritto Queue, non Queue(..) o Queue(Queue) nella dichiarazione di esportazione, non mi aspetto che il costruttore di valori del mio tipo di dati da esportare dal modulo. Questo è esattamente ciò che voglio, a fini di incapsulamento: gli utenti non dovrebbero essere in grado di usare direttamente il costruttore di valori; solo emptyQueue, enq e le altre funzioni nella mia interfaccia.

Tuttavia (e la soluzione al mio problema può essere ovvia per gli Haskellers stagionati), se carico il modulo in GHCi, sono in grado di utilizzare direttamente il costruttore di valori.

$ ghci Queue.hs 
GHCi, version 7.8.4: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
[1 of 1] Compiling Queue   (Queue.hs, interpreted) 
Ok, modules loaded: Queue. 

λ> Queue [1] [2] 
Queue {inbox = [1], outbox = [2]} 

Come indicato sopra, non è consigliabile. Che cosa sto facendo di sbagliato?

+2

possibile duplicato di [Perché è possibile che ghci veda tipi e costruttori non esportati? Come posso risolvere il problema?] (Http://stackoverflow.com/questions/27548049/why-can-ghci-see-non-exported-types-and-constructors-how-can-i-fix-it) – dfeuer

+0

@ Spiacenti, non ero a conoscenza della domanda a cui ti colleghi. – Jubobs

risposta

13

Stai facendo niente di male. È solo che, per comodità, ghci ignora le regole di scoping sui moduli che carica.

Se volete vedere quello che normalmente sarebbe a disposizione, è possibile

:m -Queue 
:m +Queue 

In seguito è possibile tornare al "tutto è disponibile" modalità con

:m *Queue 

Vedi anche What's really in scope at the prompt? nella Gazzetta documentazione.

+1

Ah si! Grazie; Non ne ero consapevole. Non è la prima volta che GHCi gioca brutti scherzi. Si prega di aggiungere un riferimento alla documentazione su GHCi ignorando le regole di scoping per impostazione predefinita e accetterò la risposta. – Jubobs

+0

Dovremmo davvero provare a scegliere una domanda canonica per questo problema. Viene fornito un * lotto *. – dfeuer

Problemi correlati