再出口合格?

时间:2010-12-08 07:41:46

标签: haskell syntax module

假设你有两个模块,比如

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

重新导出这些模块,你会得到一个名字冲突。

有解决方法吗?

2 个答案:

答案 0 :(得分:26)

基本上没有。这是Gtk2hs作者等人们长期提出的功能要求。 Gtk2hs有一个非常广泛的模块层次结构,它可能对两者都有意义:

  • 在几个不同的模块中使用相同的名称(例如,Graphics.UI.Gtk.Buttons.Button和Graphics.UI.Gtk.Buttons.CheckButton中的newButton)
  • 使用单个导入语句为用户提供导入所有这些模块的便利

目前,如果您想要将多个模块重新出口,您可以做的只有:

  • 避免在要重新导出的模块中重复使用名称
  • 在适当的情况下,使用类型类允许相同的名称用于多种不同的目的

答案 1 :(得分:11)

好问题。 Haskell报告addresses this

  

导出列表是累积的:导出列表导出的实体集是由列表中各个项导出的实体的并集。

     

[...]

     

模块导出的实体的非限定名称必须全部不同(在各自的命名空间内)。

根据我有限的Haskell知识,我会说这是不可能的。