2016-10-28 3 views
2

ハスケルで2つのスタックキューを実装しようとしましたが、コードの最初の部分でこのエラーが発生します。"接頭辞として"でも曖昧なオカレンス "空"

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 A (Foo, Bar) where 
data Foo = … 
data Bar = … 

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

行番号を確認してください - エラーはエクスポートリストにあります。 'empty 'をエクスポートしますが、その名前には2つのスコープがあります。あなたはおそらく、 'Import qualified DataStructures.Stack ...' – user2407038

答えて

1

は、モジュールAがあると

import A as B 

それはをもたらす、およびB.Barは範囲に入りますが、でもは、非修飾のFooBarをもたらします。 qualifiedインポートを使用する場合、のみ修飾名(B.Foo,B.Bar)がインポートされます。

import qualified DataStructures.Stack.LinearStack as LS 
     --------- 
DataStructures.Queue.TwoStacksQueue.emptyを明確に参照するエクスポート・リストでこれにより

emptyていますが、明示的にそれらをインポートしない限り、あなたは、LS.接頭辞でDataStructures.Stack.LinearStackからすべての機能を修飾する必要があります:たとえば

import DataStructures.Stack.LinearStack (foo, bar) 

また、エクスポートリストでは、現在のモジュール内の関数の名前を完全修飾することができます。

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

一般に、import qualified … as …は正常なデフォルトです。コード内にいくつかのプレフィックスクラッタが生成されますが、このような名前の衝突は防ぎます。 の非修飾のインポートを使用すると、DataStructures.Stack.LinearStackが新しい関数をエクスポートする場合、名前の衝突がある場合は、インポートするモジュールを変更する必要があります。