我的问题出在最后一行:
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限定,有什么替代方法可以解决命名空间冲突?我宁愿不重命名冲突函数。
编辑:更新了这些示例。
答案 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