【问题标题】:Better way of inserting directories in Haskell modules在 Haskell 模块中插入目录的更好方法
【发布时间】:2014-05-10 03:36:24
【问题描述】:

我正在用 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,我很确定我在这里遗漏了一些东西。任何帮助我摆脱这个泥潭的帮助将不胜感激!

【问题讨论】:

  • 我不知道有什么工具或方法可以解决这个问题,但听起来这将是一个有趣的小程序,可以在您更改结构时递归地更新模块名称。
  • 哈哈,我觉得你对little的定义只是在原力中引起了骚动。
  • 为了特殊性:这是 GHC 中的情况,而不是整个 Haskell。规范实际上根本没有说明编译器应该如何找到模块。我怀疑扩展 GHC 搜索能力的完善补丁会被接受......但一定要在开始黑客攻击之前征集 cmets,因为这绝对是之前已经讨论过的事情,并且有很多需要注意的好设计。
  • @ssm 还不是很好,不过是something因为无聊我拼凑了起来。你可以很容易地把它构建成一个很好的小工具来处理更多的场景,比如 literate haskell,顶部的 pragma 等等。我只是想得到一个概念证明,并且在大约 100 行中完成了。还不错,但需要更多的工作来添加错误处理和对常见用例的更多支持。
  • 你不能把Firmware 放在GHC 的导入搜索路径中吗? (使用来自 cabal 的 hs-source-dirs 或用于 GHC 的 -isrc/Firmware

标签: haskell


【解决方案1】:

如果你有 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}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多