2010-10-31 4 views
2

Моя проблема в последней строке:Существует ли пространство имен для текущего модуля?

module A where 

data A = A { f :: Int } 

defaultA = A { f = 0 } 

и

module B where 

import A as A 

data B = B { f :: Int } 

bToA :: B -> A 
bToA x = defaultA { A.f = f x } 

дает

B.hs:8:26: 
    Ambiguous occurrence `f' 
    It could refer to either `B.f', defined at B.hs:5:13 
          or `A.f', imported from A at B.hs 

Поскольку я не может включать в себя B аттестованы в себе то, что существует альтернатива для того чтобы разрешить столкновение пространства имен? Я бы предпочел не переименовывать функцию clashing.

Редактировать: обновили эти примеры.

ответ

2

Просто B.f

И вам не нужно

import A as A 

Просто

import A 
+1

Как ссылаться на 'defaultA', если модуль не« импортирует A'? – kennytm

+0

Хм, это работает, спасибо. В моем примере в реальной жизни имена модулей довольно длинные, поэтому они искали «импортное решение Foo as F». – LennyStackOverflow

+0

2KennyTM: исправлено, спасибо – Yuras

5

Я хотел бы сделать это следующим образом:

module B where 

import A hiding (A(..)) 
import qualified A as A 

bToA x = defaultA { A.f = f x } 

Таким образом, вы можете получить доступ ко всем неконфликтным именам из A без добавления «A.» и все конфликтующие имена импортируются с полной квалификацией - как «A.something». Вы сохраняете краткость кода и работаете вокруг конфликтов.

Конечно, упрощенное import qualified Some.Long.Name as S также будет работать, если вы не против добавления «S.» везде.

Смежные вопросы