2015-01-23 19 views
8

Để thực hành, tôi đang triển khai loại dữ liệu hàng đợi trong một mô-đun có tên là "Hàng đợi". kiểu dữ liệu của tôi cũng được gọi là "Queue", như là xây dựng giá trị duy nhất của nó:Tại sao tôi có thể sử dụng hàm tạo giá trị của mình mặc dù tôi không xuất nó?

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)... 

Theo như tôi hiểu, bởi vì tôi đã viết Queue, không Queue(..) hoặc Queue(Queue) trong báo cáo kết quả xuất khẩu, tôi không mong đợi hàm tạo giá trị của kiểu dữ liệu của tôi sẽ được mô-đun xuất ra. Đây chính xác là những gì tôi muốn, vì mục đích đóng gói: người dùng không thể sử dụng trực tiếp hàm tạo giá trị; chỉ emptyQueue, enq và các chức năng khác trong giao diện của tôi.

Tuy nhiên (và giải pháp cho vấn đề của tôi có thể hiển nhiên đối với Haskellers dày dạn), nếu tôi tải mô-đun của mình trong GHCi, tôi có thể sử dụng hàm tạo giá trị trực tiếp.

$ 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]} 

Như đã nêu ở trên, điều này là không mong muốn. Tôi đang làm gì sai?

+2

bản sao có thể có của [Tại sao ghci có thể thấy các loại và nhà xây dựng không xuất khẩu? Làm thế nào tôi có thể sửa chữa nó?] (Http://stackoverflow.com/questions/27548049/why-can-ghci-see-non-exported-types-and-constructors-how-can-i-fix-it) – dfeuer

+0

@ dfeuer Xin lỗi, tôi không biết câu hỏi bạn liên kết đến. – Jubobs

Trả lời

13

Bạn không làm gì sai. Nó chỉ là, để thuận tiện, ghci bỏ qua các quy tắc phạm vi trên các mô-đun mà nó tải.

Nếu bạn muốn xem những gì bình thường sẽ có sẵn, bạn có thể

:m -Queue 
:m +Queue 

Bạn sau đó có thể trở lại "tất cả những gì có sẵn" chế độ với

:m *Queue 

Xem thêm What's really in scope at the prompt? trong chính thức tài liệu.

+1

À vâng! Cảm ơn; Tôi không biết điều đó. Đây không phải là lần đầu tiên GHCi chơi các trò ảo thuật với tôi. Vui lòng thêm tham chiếu vào tài liệu về GHCi bỏ qua các quy tắc phạm vi theo mặc định và tôi sẽ chấp nhận câu trả lời của bạn. – Jubobs

+0

Chúng tôi thực sự nên cố gắng chọn một câu hỏi kinh điển cho vấn đề này. Nó xuất hiện * rất nhiều *. – dfeuer

Các vấn đề liên quan