2011-03-29 1 views
6

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

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

Итак ... как-то он знает ограничение типа класса, так как оно распечатывает его. Как это делается?

ответ

10

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

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

3

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

Таким образом, ghci компилирует исходный код в ".hi" и загружает все зависимые файлы .hi. Это дает ему полное знание всех типов. Что ghci не нужно делать, это вернуться к источнику всех импортированных модулей, ему нужны только файлы «.hi».