Haskell/GHCi - загрузка модулей из разных каталогов
У моего приложения haskell есть следующая структура каталогов:
src/
utils/Utils.hs
subsystem/Subsystem.hs
Модуль Subsystem
импортирует модуль Utils
. Я бы хотел проверить этот код в GHCi.
Проблема в том, что GHCi, похоже, ищет только модули, доступные в '.'
(текущий каталог), поэтому я скопировал Utils.hs
в папку подсистемы и смог выполнить проверку вручную Subsytem.hs
. Есть лучший способ сделать это? Например, я хотел бы запустить GHCi в каталоге src
и позволить ему искать модули в каталогах ./utils
и ./subsystem
. Могу ли я указать путь к модулю GHCi?
Ответы
Ответ 1
Вы можете указать GHCi, где искать модули, используя опцию -i
:
ghci Foo.Bar -isrc
Это загрузит src/Foo/Bar.hs
в GHCi. Таким образом, вы также можете указать два разных каталога, например:
ghci Bar.hs -i.:config
Он будет искать зависимости в./и./config/.
Дополнительную информацию о пути поиска модуля см. в руководстве пользователя GHC.
Ответ 2
По умолчанию, когда GHC ищет модули, он интерпретирует Foo.Bar
как Foo/Bar.hs
. Поэтому, если у вас есть один проект, у вас может быть модуль Utils
как Utils.hs
в каталоге верхнего уровня и модуль Utils.Fishcakes
как Utils/Fishcakes.hs
. Обратите внимание, что Utils.hs
может существовать рядом с каталогом с именем Utils
или оба могут существовать независимо. Обычный стиль, как правило, использует модуль верхнего уровня, чтобы просто реэкспортировать вещи из модулей под ним в иерархии, но это не требуется. Руководство пользователя GHC описывает описанное выше поведение, а также описывает, какие другие параметры поддерживаются.
Насколько я знаю, в большинстве случаев код будет либо использовать указанную выше структуру по умолчанию, либо использовать какую-либо другую структуру, указанную как часть сборки cabal, либо будет установлен как библиотека.
Ответ 3
Вы можете создать файл .ghci с чем-то вроде этого:
: set -isrc -iutils -isubsystem
Ответ 4
Если проект выглядит следующим образом:
src/
utils/Utils.hs
subsystem/Subsystem.hs
.....
myproject.cabal
Setup.hs
Вы можете создать файл .ghci
в корневом каталоге проекта, в котором находится src
, myproject.cabal
и Setup.hs
. Содержимое .gchi
должно быть таким.
:set -isrc/utils -isrc/subsystem
Теперь вы можете вызвать ghci из корневого каталога вашего проекта и автоматически загрузить любые связанные модули.
$ ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude>:load src/subsystem/Subsystem.hs
... should load Subsystem.hs