2015-01-28 2 views
1

Пусть я даюсь исходный файл с именем MyModule.hs и внутри него декларация модуля module My.Module where ... (примечание: неmodule MyModule where ...).Загрузите модуль GHCi по имени модуля, если имя модуля не совпадает с именем файла

Мне не разрешено изменять этот исходный файл или изменять структуру каталогов, в которой находится файл.

От чтения some docs about importing modules in GHCi, похоже, есть способы импортировать по имени файла (например, либо import или :load), но не любые способы, чтобы указать имя модуля, который будет произведен поиск во всех файлах локального каталога ,

Есть ли способ импортировать My.Module в GHCi, не делая его, указав имя файла (только имя модуля) и без его установки (например, не строить его с cabal, просто быстро бросил его в GHCi по имени модуля)?

ответ

1

Вы не можете, где имя содержит точку, согласно documentation

Для каждого из этих каталогов, он пытается добавления basename.extension в каталог, и проверяет, существует ли файл. Значение является базовое имя имя модуля с точками заменены на разделителя каталогов («/» или «\», в зависимости от системы), а также расширение является расширением источника (ГВ, LHS) ...

ключевая часть является

значения базового имени является имя модуля с точками заменяется разделителем каталогов («/» или «\», в зависимости от системы)

Так ваше имя модуля в My.Module будет найден как My/Module.hs. Вы должны были бы иметь структуру каталогов, как

project/ 
    My/ 
     Module.hs 
    project.cabal 

И из папки project можно запустить

$ cabal repl 
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
> import My.Module 

Вы можете это сделать, если ваш файл называется MyModule.hs и ваше имя модуля MyModule, но это просто особый случай правила выше.

Есть веские причины для этого, а именно, что он обеспечивает структуру, упрощающую структуру вашего проекта и алгоритм поиска GHC. Если это правило не было на месте, что бы остановить меня от

project/ 
    MyModule1.hs 
    MyModule2.hs 

где оба .hs файлы имели декларацию модуля My.Module? Какой из них будет правильным загрузить в GHCi, если я запустил import My.Module? Указав, что такое имя файла и путь, вы сразу же знаете, что модуль X.Y.Z.W.Q.R.S.T находится по пути X/Y/Z/W/Q/R/S/T.hs, не требуется поиск. Это уменьшает много неопределенности, которая может возникнуть с более слабыми спецификациями имени модуля.

+0

В последнем примере, который вы даете, я думаю, что вопрос о том, какой из них является правильным модулем для загрузки, тривиален: в зависимости от того, что находится сначала на пути поиска или в порядке поиска.Вот как это разрешено на многих других языках. Я не говорю, что это pro или con w.r.t. ваш ответ - просто потому, что я рассматриваю его как тривиальную проблему и думаю, что позволить людям повторно использовать одно и то же имя модуля, если они предпочитают, мне кажется очень хорошо. Предотвращение этого на самом деле не «защищает» вас от чего-либо. – ely

+0

Кроме того, документы обо всем этом свидетельствуют о том, что в Haskell вполне разумно и разумно делать много вещей: определить более одного модуля для каждого файла в порядке; определить один модуль в нескольких файлах в порядке (в точности путем повторного использования одного и того же имени модуля и обеспечения отсутствия конфликтов объявленных имен); и именовать модуль, отличное от имени файла, также хорошо (вы все равно можете импортировать его как пакет или в GHCi с именем файла). Все они перечислены в документах, которые я связал в своем вопросе. Поэтому, хотя сопоставление модулей с файловыми путями может быть распространенной практикой, это, конечно же, не обеспечивается языком. – ely

+0

@ prpl.mnky.dshwshr Если вы просто используете первый найденный на пути, какой метод упорядочения вы используете? Порядок Unicode? Итак, теперь один из них всегда загружается, а другой - нет, как вы загружаете второй модуль? Кроме того, я не знаю языка, который фактически делает то, что вы говорите. На языках .NET вы не можете, хотя имя файла не имеет ничего общего с структурой модуля. В Python имя файла - это именно имя модуля, вы не можете объявить свое имя модуля. – bheklilr

Смежные вопросы