Имена, импортированные из модулей, могут быть реэкспортированы.Когда это происходит, хэддок старательно связывает вас с исходным источником имени, а не со строкой импорта в модуле реэкспорта;это следует за косвенностью для вас.Это то, что происходит в вашем случае.Итак, взяв в качестве примера (++)
(первую функцию в пикшах для 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.++)
, двусмысленности нет.