Подтвердить что ты не робот

Что такое синтаксис Haskell для импорта модулей в подкаталоги?

Что такое синтаксис Haskell для импорта модулей в другой каталог?

Я начинаю с Haskell и хочу практиковать написание простых функций TDD-стиля с помощью HUnit. Однако мне сложно разобраться, как структурировать мои файлы. Пример, который поставляется с HUnit, кажется, является плоской структурой каталогов.

Я хотел бы иметь свои тесты и код HUnit в другой папке, чем мой фактический код. Я был бы признателен за быстрый пример импорта и предложение о том, как я могу структурировать свои файлы.

Если это имеет значение, я использую GHCi и NotePad ++ для выполнения моей кодировки прямо сейчас.

4b9b3361

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