2016-10-28 7 views
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'를 export하지만 그 범위 내에 두 개의 이름이 있습니다. 당신은 아마도'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이 새 기능을 반출하는 경우 이름 충돌이 있으면 가져 오는 모듈을 모두 변경해야 할 수 있습니다.