2014-12-02 6 views
1

У меня естьмодуля и путь в Haskell

корень/Main.hs:

import ADT.Stack 

main :: IO() 
main = 
    putStrLn "Hi" 

корень/ADT/Stack.hs

module Stack (Stack, empty, isEmpty, push, top, pop) where 
... 

После загрузки Main.hs, у меня есть ошибка

File name does not match module name: … 
    Saw: ‘Stack’ 
    Expected: ‘ADT.Stack’ 

Если я изменю имя модуля на ADT.Sta ck в Stack.hs, я могу избавиться от ошибки. Однако я не понимаю причины такого ограничения.

Нет ли способа избежать указания в коде Stack.hs того, что уже закодировано в имени каталога, в котором оно содержится?

Если альтернативного способа нет, есть ли веская причина в этом?

ответ

3

Если вы используете иерархические пространства имен, имена модулей должны отражать полный путь. Так, в root/ADT/Stack.hs, вы должны иметь

module ADT.Stack (Stack, empty, isEmpty, push, top, pop) where 

После того, как вы заметили, что все должно быть хорошо.

Мне не известно о возможности получить имя модуля не только от имени, которое вы даете ему в файле, но и от местоположения файла. (Это то, что вам нужно, не так ли?) Конечно, это должно быть возможно с некоторой фантастической предварительной обработкой, но вы, вероятно, не хотите туда идти.

Итак, почему же такие вещи, как они? Не уверен, что для вас это квалифицируется как хорошая причина, но можно утверждать, что эта схема имеет преимущество в том, что, просто перемещая файл в другой каталог, вы не нарушаете никаких клиентских кодов. Вместо этого вы получаете ошибку уже при компиляции перемещенного файла.

Резервирование в местоположении файла и имени модуля позволяет процессорам находить импортированные модули с минимальным набором «путей поиска». Кроме того, он обеспечивает стандарт для организации исходных файлов по более крупным проектам.

+0

интересно, чтобы ваше мнение как haskeller. спасибо – nicolas

+0

ради полноты, я не уверен, что согласен с тем преимуществом, которое вы упомянули. он идет по цене: если вы перемещаете файл из каталога в другой, вам не только нужно изменить, где клиент найдет файл, но это нормально, но вы также должны сами изменить содержимое самих файлов! У меня нет много практики с этим, но это неправильно. Я считаю Agda более простой в этом отношении (нет избыточного кодирования, простого соглашения ..) – nicolas

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