Как: t в ghci получает доступ ко всей этой интроспективной информации? - PullRequest
6 голосов
/ 29 марта 2011

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

Prelude> :t show
show :: (Show a) => a -> String

Так что ... каким-то образом он знает ограничение класса типов, так как выводит его на печать.Как это происходит?

Ответы [ 2 ]

10 голосов
/ 29 марта 2011

Информация хранится в интерфейсных файлах (module.hi). Чтобы понять это из работающей программы, вам нужно найти и прочитать файлы .hi (я считаю, что пакет Hint в Hackage делает это); поскольку ghci читает файлы .hi в процессе компиляции в байт-код, эта информация всегда доступна.

Вы можете увидеть, что находится в .hi файле с ghc --show-iface module.hi.

3 голосов
/ 29 марта 2011

Отдельно скомпилированные «двоичные файлы» - это файлы .hi.Они содержат всю информацию о типах, так что вы можете написать код, который их использует, и они содержат все определения классов типов и все экземпляры классов типов, чтобы ваш код мог использовать или расширять их.

Таким образом, ghci compile sourceв ".hi" и загружает все зависимые ".hi" файлы.Это дает ему совершенное знание всех типов.Ghci не нужно возвращаться к источнику всех импортированных модулей, ему нужны только файлы .hi.

...