Haskell中的问题:
module Foo.A where foo = 42
和
module Foo.B where foo = 12
你想写一个超级模块
module Foo ( module Foo.A , module Foo.B ) where import Foo.A import Foo.B
重新导出这些模块,你会得到一个名字冲突。
注意,每个模块(foo1,foo2等)中都可以有大量的foo
等功能,我想从两个模块中使用它们。毕竟,每个模块中也可以有data
个相同的成员名称。所以隐藏不是解决方案。
我不认为镜头可以解决它。
现在,弗雷格是否解决了Haskell的“再出口合格”问题?如果我没记错的话似乎会这样,但我现在找不到证据,有人可以详细说明吗?
答案 0 :(得分:3)
我猜它没有。在Frege中,模块只能重新导出项目(即函数,类型,类型类),而不能重新导出模块。
这意味着,如果您要导入的模块层次结构中有一些foo
,则仍需要隐藏所有,但最多只能隐藏一个。{/ p>
你在弗雷格可以做的是:
import mod.A(foo fooA)
import mod.B(foo fooB)
在导入模块中有效地将A.foo
重命名为fooA
,将B.foo
重命名为fooB
。这也适用于再出口。例如,在frege.Prelude
我们有
import Prelude.PreludeBase public(!= /=)
这将导致导入frege.Prelude
的任何人拥有运营商/=
。但这只是!=
Ord
运算符的别名
可以想象,我们需要同时拥有!=
和/=
,以避免分别来自Java或Haskell阵营的投诉。