我有这段代码
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
答案 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)
有分层模块名称。您可以拥有名为M
和M.A
以及M.X
的模块,但模块本身不会嵌套,M
与M.A
无关。语言是关心的。
如果您希望M
导出所有M.A
和M.X
导出,则必须明确地执行此操作:
module M (module M.A, module M.X) where
import M.A
import M.X
-- rest of M
答案 2 :(得分:1)
不,你不能。但是你的评论提到你只是在寻找避免命名冲突的方法。为此,您可以使用{-# LANGUAGE DuplicateRecordFields #-}
扩展名,编译器将允许重复的记录字段名称。