是否可以在Haskell中使用子模块?

时间:2017-02-22 11:48:03

标签: haskell

我有这段代码

module M where

a = 1
b = 2
x = 10
y = 20

...但随着模块的增长,处理重复的名称变得困难。

是否可以拥有这样的名称空间?

module M where
  module A where
    a = 1
    b = 2

  module X where
    x = 10
    y = 20

..然后

...
import M

s = A.a + X.y

3 个答案:

答案 0 :(得分:9)

Haskell AFAIK目前不支持您提出的建议。也就是说,没有什么能阻止你创建看似命名空间的模块。例如:

module Top where

myTopFunc :: a -> Int
myTopFunc _ = 1

并在另一个档案中:

module Top.Sub where

mySubFunc :: a -> String
mySubFunc _ = "Haskell"

除此之外,您还需要更多技巧来安排模块。如果将模块A导入B,则可以从B导出A的可见实体,就好像它们是自己的一样。随后,在导入B时,您将能够使用那些函数/数据类型等,而不知道它们最初的来源。使用上述模块的一个例子是:

module Top (
  myTopFunc,
  TS.mySubFunc
  ) where

import qualified Top.Sub as TS

myTopFunc :: a -> Int
myTopFunc _ = 1

现在,只需导入Top即可使用这两种功能。

import Top (myTopFunc, mySubFunc)

答案 1 :(得分:4)

有分层模块名称。您可以拥有名为MM.A以及M.X的模块,但模块本身不会嵌套,MM.A无关。语言是关心的。

如果您希望M导出所有M.AM.X导出,则必须明确地执行此操作:

module M (module M.A, module M.X) where
import M.A
import M.X
-- rest of M

答案 2 :(得分:1)

不,你不能。但是你的评论提到你只是在寻找避免命名冲突的方法。为此,您可以使用{-# LANGUAGE DuplicateRecordFields #-}扩展名,编译器将允许重复的记录字段名称。