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?
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
@ dfeuer Üzgünüm, bağlandığınız sorunun farkında değildim. – Jubobs