【问题标题】:Ambiguous occurrence ‘empty’ even with a " as Prefix "模棱两可的出现“空”即使带有“作为前缀”
【发布时间】:2016-10-28 22:40:21
【问题描述】:

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

【问题讨论】:

  • 查看行号 - 错误在您的导出列表中。您导出 empty 但范围内有两个这样的名称。你可能想要import qualified DataStructures.Stack...

标签: haskell ambiguous


【解决方案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,但您必须使用LS. 前缀限定来自DataStructures.Stack.LinearStack 的所有函数,除非您明确导入它们:

import DataStructures.Stack.LinearStack (foo, bar)

或者,在导出列表中,您可以完全限定当前模块中的函数名称:

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

一般来说,import qualified … as … 是一个合理的默认值。它会在代码中产生一些前缀混乱,但它可以防止这样的名称冲突。它也更具前瞻性:使用 unqualified 导入,如果 DataStructures.Stack.LinearStack 导出一个新函数,那么如果存在名称冲突,您可能必须更改导入它的任何模块。

【讨论】:

    猜你喜欢
    • 2014-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多