Что такое синтаксис Haskell для импорта модулей в подкаталоги?
Что такое синтаксис Haskell для импорта модулей в другой каталог?
Я начинаю с Haskell и хочу практиковать написание простых функций TDD-стиля с помощью HUnit. Однако мне сложно разобраться, как структурировать мои файлы. Пример, который поставляется с HUnit, кажется, является плоской структурой каталогов.
Я хотел бы иметь свои тесты и код HUnit в другой папке, чем мой фактический код. Я был бы признателен за быстрый пример импорта и предложение о том, как я могу структурировать свои файлы.
Если это имеет значение, я использую GHCi и NotePad ++ для выполнения моей кодировки прямо сейчас.
Ответы
Ответ 1
Вы действительно не делаете это из исходного кода Haskell; вместо этого вы говорите компилятору, где искать. Обычный метод находится в файле .cabal. Подробнее см. руководство пользователя cabal. Вам нужен параметр "hs-source-dirs" .
В качестве альтернативы вы можете передать путь непосредственно компилятору. Однако Cabal - лучший метод.
Каждое имя пути в параметре "hs-source-dirs" указывает корень иерархии модуля. В основном, если вы импортируете модуль под названием "Data.Foo.Bar", тогда компилятор ищет файл с относительным именем "Data/Foo/Bar.hs" в каждом каталоге, заданном "hs-source-dirs" , и импортирует первый который он находит.
Ответ 2
Пол answer присутствует, но я просто хотел расширить идею передачи пути непосредственно компилятору для быстрого и простого решения, в основном для запуска скрипты с runhaskell
или runghc
.
Все, что вам нужно сделать, - передать флаг -i
компилятору с помощью списка каталогов, разделенных двоеточиями. Затем компилятор проверяет эти каталоги для исходных файлов импортированных модулей.
Итак, например, если у вас есть структура каталогов:
home/
|-- user/
|-- haskell/
|-- Module1.hs
|-- foo/
|-- Module2.hs
И вы хотели бы, чтобы Module2
мог импортировать Module1
, а затем внутри Module2.hs
добавить свой оператор импорта как обычно:
import Module1
Затем, когда вы выполняете Module2.hs
с помощью runhaskell
, вы запускаете его следующим образом:
$ cd /home/user/haskell/foo
$ runhaskell -i/home/user/haskell Module2.hs
Ссылка: http://www.haskell.org/ghc/docs/7.0.1/html/users_guide/separate-compilation.html#search-path