haskell - Haskell 中可以有子模块吗?

标签 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

最佳答案

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

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)

关于haskell - Haskell 中可以有子模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390523/

相关文章:

haskell - 如何正确地将编译时信息传递给 Template Haskell 函数?

haskell - 在用户定义类型和现有类型之间定义已经存在(例如在 Prelude 中)运算符的正确方法是什么?

Haskell 与 erlang : difference in foldl?

haskell 设置数据类型

haskell - 象牙色 : how to use the ivory-hw package

algorithm - Haskell 中全 1 的最大平方

windows - 无法加载 OpenGL 进程,只能从 Haskell 加载

haskell - 为可能没有值的数据类型指定字段的正确方法是什么

haskell - 如何将数字作为字符串添加到haskell中的字符串

haskell - 带递归的 Monad Transformer