Есть ли пространство имен для текущего модуля? - PullRequest
2 голосов
/ 31 октября 2010

Моя проблема в последней строке:

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, есть ли альтернатива для разрешения конфликта имен? Я бы не стал переименовывать функцию столкновения.

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

Ответы [ 3 ]

6 голосов
/ 31 октября 2010
import qualified A as A
5 голосов
/ 01 ноября 2010

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

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.'во всем мире.

2 голосов
/ 31 октября 2010

Просто B.f

И вам не нужно

import A as A

Просто

import A
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...