Để 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?
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
@ dfeuer Xin lỗi, tôi không biết câu hỏi bạn liên kết đến. – Jubobs