我有这段代码
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
我有这段代码
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
module Top where
myTopFunc :: a -> Int
myTopFunc _ = 1
另一个文件中:
module Top.Sub where
mySubFunc :: a -> String
mySubFunc _ = "Haskell"
除此之外,您还有更多的技巧来安排您的模块。如果您将模块A导入B,则可以将A的可见实体从B中导出,就好像它们是自己的一样。随后,在导入B时,您将能够使用那些函数/数据类型等,而不知道它们最初来自哪里。使用上面的模块作为示例:
module Top (
myTopFunc,
TS.mySubFunc
) where
import qualified Top.Sub as TS
myTopFunc :: a -> Int
myTopFunc _ = 1
Top
,就可以使用这两个函数了。import Top (myTopFunc, mySubFunc)
M
变成 M.Core
或类似的形式,A
/B
变成 M.A
/M.B
,而新模块 M
则简单地重新导出所有定义。 - user2407038有层级的模块名称。你可以拥有名为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
{-# LANGUAGE DuplicateRecordFields #-}
扩展,编译器将允许重复的记录字段名。
module A.B where
有什么问题吗? - Willem Van Onsem