弗雷格是否解决了Haskell的“再出口合格”问题?

时间:2016-01-31 09:32:46

标签: haskell frege

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的“再出口合格”问题?如果我没记错的话似乎会这样,但我现在找不到证据,有人可以详细说明吗?

1 个答案:

答案 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阵营的投诉。