我试图在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
答案 0 :(得分:1)
假设您有一个模块A
:
module A (Foo, Bar) where
data Foo = …
data Bar = …
当你写:
import A as B
这会将B.Foo
和B.Bar
纳入范围,但也会带来不合格的Foo
和Bar
。当您使用qualified
导入时,仅导入限定名称(B.Foo
,B.Bar
)。例如:
import qualified DataStructures.Stack.LinearStack as LS
---------
有了这个,导出列表中的empty
将明确引用DataStructures.Queue.TwoStacksQueue.empty
,但您必须使用DataStructures.Stack.LinearStack
前缀限定LS.
中的所有函数,除非您导入他们明确地说:
import DataStructures.Stack.LinearStack (foo, bar)
或者,在导出列表中,您可以完全限定当前模块中函数的名称:
module DataStructures.Queue.TwoStacksQueue
( DataStructures.Queue.TwoStacksQueue.empty
, …
) where
一般来说,import qualified … as …
是一个理智的默认值。它在代码中生成一些前缀杂乱,但它可以防止这样的名称冲突。它也更具有前瞻性:使用非限定导入,如果DataStructures.Stack.LinearStack
导出新函数,那么如果存在名称冲突,则可能必须更改导入它的任何模块。