当前模块是否有命名空间?

时间:2010-10-31 18:44:30

标签: haskell module scope

我的问题出在最后一行:

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 个答案:

答案 0 :(得分:6)

import qualified A as A

答案 1 :(得分:5)

我这样做:

module B where

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

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

通过这种方式,您可以从A中访问所有非冲突名称,而无需预先添加“A”。所有冲突的名字都是以完全的资格进口的 - 如'A.something'。您保留了代码的简洁性并解决冲突。

当然,如果您不介意预先添加'S',那么简化import qualified Some.Long.Name as S也会有用。无处不在。

答案 2 :(得分:2)

只需B.f

你不需要

import A as A

只需

import A