Каков синтаксис Haskell для импорта модулей в подкаталогах? - PullRequest
30 голосов
/ 18 февраля 2011

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

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

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

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

Ответы [ 2 ]

29 голосов
/ 18 февраля 2011

Вы на самом деле не делаете это из исходного кода на Haskell;вместо этого вы указываете компилятору, где искать.Обычный метод находится в файле .cabal.Подробнее см. Руководство пользователя Cabal .Вам нужен параметр "hs-source-dirs".

В качестве альтернативы вы можете передать путь непосредственно в компилятор.Однако лучше использовать Cabal.

Каждое имя пути в параметре "hs-source-dirs" указывает корень иерархии модулей.В основном, если вы импортируете модуль с именем «Data.Foo.Bar», то компилятор ищет файл с относительным именем «Data / Foo / Bar.hs» в каждом каталоге, заданном «hs-source-dirs», и импортирует первыйодин он находит.

16 голосов
/ 28 ноября 2012

Paul's 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

...