Вы не можете, где имя содержит точку, согласно 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
, не требуется поиск. Это уменьшает много неопределенности, которая может возникнуть с более слабыми спецификациями имени модуля.
В последнем примере, который вы даете, я думаю, что вопрос о том, какой из них является правильным модулем для загрузки, тривиален: в зависимости от того, что находится сначала на пути поиска или в порядке поиска.Вот как это разрешено на многих других языках. Я не говорю, что это pro или con w.r.t. ваш ответ - просто потому, что я рассматриваю его как тривиальную проблему и думаю, что позволить людям повторно использовать одно и то же имя модуля, если они предпочитают, мне кажется очень хорошо. Предотвращение этого на самом деле не «защищает» вас от чего-либо. – ely
Кроме того, документы обо всем этом свидетельствуют о том, что в Haskell вполне разумно и разумно делать много вещей: определить более одного модуля для каждого файла в порядке; определить один модуль в нескольких файлах в порядке (в точности путем повторного использования одного и того же имени модуля и обеспечения отсутствия конфликтов объявленных имен); и именовать модуль, отличное от имени файла, также хорошо (вы все равно можете импортировать его как пакет или в GHCi с именем файла). Все они перечислены в документах, которые я связал в своем вопросе. Поэтому, хотя сопоставление модулей с файловыми путями может быть распространенной практикой, это, конечно же, не обеспечивается языком. – ely
@ prpl.mnky.dshwshr Если вы просто используете первый найденный на пути, какой метод упорядочения вы используете? Порядок Unicode? Итак, теперь один из них всегда загружается, а другой - нет, как вы загружаете второй модуль? Кроме того, я не знаю языка, который фактически делает то, что вы говорите. На языках .NET вы не можете, хотя имя файла не имеет ничего общего с структурой модуля. В Python имя файла - это именно имя модуля, вы не можете объявить свое имя модуля. – bheklilr