Если вы хотите, чтобы ваши модули были доступны из нескольких разных проектов, я бы порекомендовал создать для них пакет cabal и установить его, используя cabal install
. Публикация в hackage не требуется - cabal install
без аргументов ищет файл .cabal
в текущем каталоге и устанавливает соответствующий пакет.
Если вы хотите, чтобы ваши модули были доступны из одного проекта - обычная практика организации ваших источников в иерархическом дереве папок применима и к Haskell. Позвольте мне показать пример:
Hello/World.hs
Foo/Bar.hs
Quux.hs
Hello.hs
Hello/World.hs
должно иметь module Hello.World where
в заголовке. Основной модуль должен иметь module Main
, но реальное имя файла может быть любым (например, Quux.hs
). В Foo/Bar.hs
вы можете использовать import Hello.World
. Когда вы загружаете Foo/Bar.hs
в ghci
, текущий каталог должен быть корнем вашего дерева, иначе он не найдет Hello.World. Вы можете передать имена модулей вместо имен файлов в ghci: например, ghci Hello.World будет работать.
Вот документация:
http://haskell.org/ghc/docs/latest/html/users_guide/separate-compilation.html
http://haskell.org/ghc/docs/latest/html/users_guide/packages.html