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

时间:2014-05-10 03:36:25

标签: haskell

我正在Haskell中编写一个(实际上是我的第一个)大型程序,并试图将我的程序分解为模块,这样可能更容易维护。在Haskell中,模块名称似乎取决于目录结构。这非常好,直到我必须为程序嵌入另一层目录结构。我将在下面给出一个非常简单的例子:

让我们说我们开始使用具有以下目录结构的Haskell程序。

  • [方括号]中的名称代表目录,
  • {li> {花括号}中的名称代表模块,
  • (常规括号中)的名称表示模块中关联的文件名
[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用于几个大型项目,我很确定我在这里遗漏了一些东西。任何帮助我摆脱这个泥潭的帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

如果你有perl和bash并找到所有这些,你可以这样做:

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