2015-01-23 36 views
8

Pratikte, kuyruk kuyruğu "Queue" adlı bir modülde veri veriyorum. onun tek değer yapıcı olarak My veri türü de, "Kuyruk" denir: Bildiğim kadarıyla anladığım kadarıylaVerme işlemini yapmama rağmen neden kurucuyu kullanabilirim?

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

Ben ihracat açıklamada Queue değil Queue(..) veya Queue(Queue) yazdım çünkü ben beklemiyorum modül tarafından ihraç edilecek veri türümün kurucu değeri. Bu, kapsülleme amaçları için tam olarak istediğim şey: kullanıcılar doğrudan yapıcıyı kullanamaz; Sadece emptyQueue, enq ve arayüzümdeki diğer işlevler. Modülümü GHCi'ye yüklediğimde, doğrudan yapıcı değeri kullanabiliyorum (Ancak, sorunumun çözümü için Haskellers için belirgin olabilir).

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

Yukarıda belirtildiği gibi, bu istenmeyen bir durumdur. Neyi yanlış yapıyorum?

+2

olası kopyası [Neden ihraç edilmemiş türleri ve kurucuları görebilir? Bunu nasıl düzeltebilirim?] (Http://stackoverflow.com/questions/27548049/why-can-ghci-see-non-exported-types-and-constructors-how-can-i-fix-it) – dfeuer

+0

@ dfeuer Üzgünüm, bağlandığınız sorunun farkında değildim. – Jubobs

cevap

13

Hatalı bir şey yapmıyorsunuz. Sadece, kolaylık sağlamak için, ghci yüklediği modüllerdeki kapsam kurallarını göz ardı eder.

normalde mevcut olacağını görmek istiyorsanız

, memur yapabildiğiniz

:m -Queue 
:m +Queue 
da

:m *Queue 

See ile daha sonra dönebilir

"her şey mevcuttur" modunda What's really in scope at the prompt? dokümantasyon.

+1

Ah evet! Teşekkürler; Bunun farkında değildim. GHCi bana ilk kez hile yapıyor değil. Lütfen GHCi'nin kapsam belirleme kurallarını varsayılan olarak dikkate almama konusundaki belgelerine bir referans ekleyin ve cevabınızı kabul edeceğim. – Jubobs

+0

Bu konuda gerçekten bir kanonik soru seçmeye çalışmalıyız. Bu bir * lot * geliyor. – dfeuer