haskell - 在 Haskell 模块中插入目录的更好方法

标签 haskell

我正在用 Haskell 编写一个(实际上是我的第一个)大型程序,并尝试将我的程序分解为模块,以便它更容易维护。在 Haskell 中,模块名称似乎依赖于目录结构。这完全没问题,直到我必须为程序嵌入另一层目录结构。下面我将给出一个非常简单的例子:

假设我们从具有以下目录结构的 Haskell 程序开始。

  • [方括号]中的名称代表目录,
  • {大括号}中的名称代表模块,
  • (普通括号)中的名称表示模块内关联的文件名
[src]
    - (Main.hs) {Main}
    - (PRBS.hs) {PRBS}
    - [Hardware]
        - (DataDef.hs) {Hardware.DataDef}
        - (ShiftRegister.hs) {Hardware.ShiftRegister}

这一切都很好。我可以将任何我想要的东西导入到任何我想要的地方。但是,现在假设我想创建另一个抽象级别,如下所示:

[src]
    - (Main.hs) {Main}
    - [Firmware]
        - (PRBS.hs) {Firmware.PRBS}
        - [Hardware]
            - (DataDef.hs) {Firmware.Hardware.DataDef}
            - (ShiftRegister.hs) {Firmware.Hardware.ShiftRegister}

现在请注意,硬件中所有模块的名称都已更改。我现在必须更改每个文件以及导入文件的所有其他文件中的模块名称。我仅在示例中显示了三个文件。如果目录结构最终有数百个文件和数十个嵌入目录,那么维护代码可能变得不可能。此外,如果在任何时候,我想复制一个目录(及其当前目录系统中特定点的子目录),我需要找出它之前的所有先前目录,并手动更改每个目录中的模块名称文件。

由于 Haskell 在几个大型项目中使用,我非常确定我在这里遗漏了一些东西。任何帮助我摆脱困境的帮助将不胜感激!

最佳答案

如果你有 perl 和 bash 以及 find 等等,你可以这样做:

find Firmware/Hardware/ -name '*.hs' -exec perl -i.bak -pe \
       's/^module (Hardware\.\S+)/module Firmware.$1/' \
       {} \;
diff Firmware/Hardware/DataRef.hs{,.bak}

关于haskell - 在 Haskell 模块中插入目录的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23576829/

相关文章:

haskell - 访问元组中的特定元素

Haskell Prelude 带有隐藏,如何撤消?

function - 如何在 Haskell 中定义中缀函数?

haskell - 使用 Yesod.Auth.Email 自定义注册表单

队列的 Haskell 类型类

haskell - Haskell 中的 monad 函数 dist 和 join 之间有什么关系?

Haskell:我应该使用 Data.Text.Lazy.Builder 来构造我的 Text 值吗?

Haskell:从 POSIXTime/NominalDiffTime 中提取 Int

haskell - Int32 和 Int64 的性能如何?

haskell - 同一个单子(monad)变压器的不同排序有什么区别?