У меня есть большой файл на Haskell (около 3000 строк) со многими импортами (около 150).Я пытаюсь разбить его на более мелкие файлы, чтобы, среди прочего, улучшить параллелизм сборки и, следовательно, сократить время сборки.
Самый простой и наивный способ сделать это может бытьдублировать весь заголовок импорта среди всех новых разбитых файлов.Все бы работало, за исключением того, что было бы много повторений в этих (возможно, 5-10) новых файлах, и нагрузка на обслуживание значительно ухудшилась бы, т.е. когда нужно было изменить один из импортов, это происходит сейчасв 10 местах вместо одного.
Более сложный вариант - создать файл CommonImports.hs, в который я импортирую все необходимое, а затем повторно экспортировать ala module CommonImports (module X) where import Foo as X
.Это будет работать по большей части, за исключением того, что существует около 50 импортных товаров, которые квалифицированы.Насколько я знаю, в настоящее время нет способа реэкспортировать / реимпортировать, сохранив первоначальные квалификации.Это можно сделать с помощью большого количества рефакторинга, где я удаляю все квалификации и разрешаю любые конфликты имен.
Существует 3-й вариант: использовать функцию препроцессора C #include
.Я уже использовал это раньше, и это работает, даже сохраняя квалифицированный импорт как есть.Но есть некоторые неудачные замечания: ghci и, следовательно, ghcid не замечают, когда изменяется файл #include
d.Я попытался преодолеть это с небольшой помощью TH:
import qualified Language.Haskell.TH.Syntax as TH
#include "./relative/../path/to/File.cpp.hs"
$(TH.addDependentFile "/absolute/path/to/File.cpp.hs" >> pure [])
Безрезультатно.Оказывается, это отсутствующая функция в GHCi: https://ghc.haskell.org/trac/ghc/ticket/4900#comment:81
GHCid занимает центральное место в моем рабочем процессе, поэтому это прискорбно.
Я пропустил какие-либо другие подходычто некоторые из вас могут использовать?Может быть, те, которые имеют меньшие недостатки или различные компромиссы?