0

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 等)中可能有很多功能,我想从两个模块中使用它们。foodata毕竟,每个模块中也可以存在具有相同成员名称的 s。所以隐藏不是解决办法。我认为 Lens 可以解决它。

现在,弗雷格解决了Haskell的“再出口合格”问题吗?如果我没记错的话似乎是这样,但是我现在找不到证据,有人可以详细说明吗?

4

1 回答 1

3

我想它没有。在 Frege 中,模块只能重新导出项目(即函数、类型、类型类),但不能重新导出模块。

这意味着,如果您foo在要导入的模块层次结构中有一些 s,您仍然需要隐藏除最多一个之外的所有内容。

你可以在弗雷格做的是:

import mod.A(foo fooA)
import mod.B(foo fooB)

在导入模块中有效地重命名A.foofooA和。这也适用于再出口。例如,在我们有B.foofooBfrege.Prelude

import Prelude.PreludeBase public(!= /=)

这将导致任何导入frege.Prelude的操作员都/=可用。但这只是!=运算符的别名Ord

可以想象,为了避免分别来自 Java 或 Haskell 阵营的抱怨,我们需要两者!=兼而有之/=

于 2016-01-31T11:28:35.630 回答