Лучший способ вставки каталогов в модули 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 используется в нескольких крупных проектах, я очень уверен, что здесь что-то не хватает. Любая помощь в том, чтобы вытащить меня из этой трясины, будет с благодарностью!

Ответ 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}