2016-05-03 9 views
1

Я не уверен, что моя проблема здесь. У меня есть трио модулей A.hs, B.hs и C.hs. Все они расположены в C:\..path...\folder и модули В и С, как импорт из А.Загрузка модулей Haskell, имеющих зависимости

То есть, как модули B и C содержат линию import A

я могу :l C:\..path..\folder\A.hs в gchi и играть с его содержанием; Однако, GHCi дает следующее сообщение об ошибке при попытке :l C:\..path..\folder\B.hs или :l C:\..path..\folder\C.hs

Could not find module `A' 
    Use -v to see a list of the files searched for. 
Failed, modules loaded: none. 

Что я нахожу странным, потому что у меня не было никаких проблем B.hs к b.exe и запуску исполняемого файла. Как я могу скомпилировать и запустить модуль, который я не могу загрузить в ghci? Или, почему импорт будет успешным во время компиляции, но не будет загружаться; особенно когда сам импортируемый модуль сам по себе загружен?

+0

У меня была аналогичная проблема. Если вы загружаете модули при запуске ('ghci A.hs B.hs'), это дает ошибку? –

+0

Хм, поэтому я попробовал, и он работает с некоторыми оговорками. Если я запустил ghci в предложенном вами порядке, то ghci заявит, что оба модуля – Tshimanga

+0

Хм, он работает с некоторыми оговорками: Если я запустил 'ghci A.hs B.hs', то ghci заявляет, что оба модуля были загружены, но затем, когда я фактически начинаю пытаться взаимодействовать с содержимым, доступны только функции и типы из A.hs. Я получаю ошибку не в области видимости для чего-либо в B.hs. Если я обмениваюсь аргументами (запускаюсь вместо этого как 'ghci B.hs A.hs'), я могу играть с содержимым обоих. Эта особенность интересна сама по себе. Тем не менее, вопрос о понимании того, почему исходный подход терпит неудачу, все же остается; но, этот обход ценится. Спасибо @WolfeMacfarlane – Tshimanga

ответ

4

По умолчанию ghci осуществляет поиск только в текущем каталоге для импортированных модулей. Для начала, текущий каталог - тот, который использовался для запуска ghci; но он может быть изменен с ghci командой :cd. Таким образом, вы можете

> :cd C:\...path...\folder 
> :l B.hs 

и это должно найти как B.hs и A.hs в том, что теперь текущий каталог. Альтернативно (и особенно если у вас есть модули в нескольких каталогах), вы можете запустить ghci с помощью опции командной строки -i, чтобы добавить каталоги в путь поиска модуля. Например, в вашей командной строки, вы можете

% ghci -iC:\...path...\folder 
> :l B.hs 

, который будет инструктировать ghciC:\...path...\folder включить в свой путь поиска, и, следовательно, найти B.hs и A.hs там, даже если это не текущий каталог.

+0

А, я вижу. Это определенно имеет смысл. Ответить – Tshimanga