2016-10-28 33 views
2

我試圖在Haskell中實現兩個堆棧隊列,但在我的第一個代碼中出現此錯誤。即使使用「作爲前綴」,模糊發生「空」

TwoStacksQueue.hs:3:5: 
    Ambiguous occurrence ‘empty’ 
    It could refer to either ‘DataStructures.Queue.TwoStacksQueue.empty’, 
         defined at TwoStacksQueue.hs:15:1 
         or ‘LS.empty’, 
         imported from ‘DataStructures.Stack.LinearStack’ 

這是代碼(我不能即使的isEmpty開始):

module DataStructures.Queue.TwoStacksQueue 
(Queue 
, empty 
, isEmpty 
, enqueue 
, dequeue 
, first 
) where 

import DataStructures.Stack.LinearStack as LS 

data Queue a = Empty | Node a (Stack a) (Stack a) 

empty :: Queue a 
empty = Empty 
+3

查看行號 - 錯誤出現在您的導出列表中。你輸出'空',但是在範圍內有兩個這樣的名字。您可能需要'導入合格的DataStructures.Stack ...' – user2407038

回答

1

假設你有一個模塊A

module A (Foo, Bar) where 
data Foo = … 
data Bar = … 

當你寫:

import A as B 

這會帶來B.FooB.Bar納入範圍,但它也帶來了不合格FooBar。當您使用qualified導入時,僅導入導入了限定名稱(B.Foo,B.Bar)。例如:

import qualified DataStructures.Stack.LinearStack as LS 
     --------- 

有了這個,empty在導出列表將明確引用DataStructures.Queue.TwoStacksQueue.empty,但你必須從DataStructures.Stack.LinearStackLS.前綴資格的所有功能,除非你導入它們明確:

import DataStructures.Stack.LinearStack (foo, bar) 

或者,在導出列表,你完全可以在當前模塊中出線函數的名稱:

module DataStructures.Queue.TwoStacksQueue 
    (DataStructures.Queue.TwoStacksQueue.empty 
    , … 
) where 

一般來說,import qualified … as …是一個理智的默認值。它會在代碼中產生一些前綴混亂,但它可以防止這樣的名稱衝突。這也是更加面向未來的:使用不合格的導入,如果DataStructures.Stack.LinearStack導出新函數,那麼如果存在名稱衝突,則可能必須更改導入它的任何模塊。