即使使用“as Prefix”,模糊发生'空'

时间:2016-10-28 22:40:21

标签: haskell ambiguous

我试图在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

1 个答案:

答案 0 :(得分:1)

假设您有一个模块A

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

当你写:

import A as B

这会将B.FooB.Bar纳入范围,但会带来不合格的FooBar。当您使用qualified导入时,导入限定名称(B.FooB.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导出新函数,那么如果存在名称冲突,则可能必须更改导入它的任何模块。