Почему Hackage связывает модуль с другим исходным файлом? - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь понять структуру базового пакета, отображаемую Hackage.После https://en.wikibooks.org/wiki/Haskell/Modules имя модуля должно отражать путь к его источнику;Процитируем вышесказанное:

Имя файла - это имя модуля плюс расширение файла .hs.Любые точки "."в имени модуля изменяются каталоги.

Если взять в качестве примера Data.List, это заставляет меня поверить, что должен быть исходный файл под путем ../Data/List.hs, которыйзатем содержит

module Data.List where ...

(список экспорта по модулю).

С другой стороны, если я просматриваю модуль Data.List в Hackage и перехожу по ссылкам '# Source', меня направляютисходные файлы для различных модулей.Среди них: GHC.Base, Data.OldList, Data.Foldable, GHC.List.

Опять же, во-первых, моя локальная установка базового пакета явно содержит файл интерфейса ../Data/List.hi.

Поэтому мой вопрос: как объяснить несоответствие?Что на самом деле выставлено на выставке Hackage?

Заранее благодарим вас за понимание!

1 Ответ

0 голосов
/ 25 октября 2018

Имена, импортированные из модулей, могут быть реэкспортированы.Когда это происходит, хэддок старательно связывает вас с исходным источником имени, а не со строкой импорта в модуле реэкспорта;это следует за косвенностью для вас.Это то, что происходит в вашем случае.Итак, взяв в качестве примера (++) (первую функцию в пикшах для Data.List), код имеет следующую структуру:

 -- GHC/Base.hs
 module GHC.Base where
 (++) = ...

 -- Data/OldList.hs
 module Data.OldList ( (++) {- re-exports GHC.Base's (++) -}, ... ) where
 import GHC.Base -- brings (++) into scope

 -- Data/List.hs
 module Data.List ( (++), ... ) where
 import Data.OldList hiding ( ... {- does not mention (++) -} )

Таким образом, вы можете видеть, что пикша действительно следовала two ссылки: (++) было импортировано из Data.OldList, и даже там был реэкспорт.

Компилятор тщательно отслеживает оригинальный модуль, который также определил имя;если вы импортируете все Data.List, Data.OldList и GHC.Base, вы обнаружите, что вы все еще можете использовать (++), даже если на первый взгляд кажется, что он может быть неоднозначным, какой из (Data.List.++), (Data.OldList.++) или (GHC.Base.++) вы имели в виду.Поскольку все три фактических значения в конечном итоге сводятся к (GHC.Base.++), двусмысленности нет.

...