В Haskell для определения экземпляра класса типов вам необходимо предоставить словарь функций, требуемых классом типов. т.е. чтобы определить экземпляр Bounded
, вам нужно предоставить определение для minBound
и maxBound
.
Для целей этого вопроса давайте назовем этот словарь vtbl
для экземпляра класса типов. Дайте мне знать, если это плохая аналогия.
Мой вопрос сосредоточен на том, какую генерацию кода я могу ожидать от GHC, когда я вызываю функцию класса типа. В таких случаях я вижу три возможности:
- поиск vtbl, чтобы найти функцию реализации, не работает во время выполнения
- поиск vtbl выполняется во время компиляции, и прямой вызов функции реализации выдается в сгенерированном коде
- поиск vtbl выполняется во время компиляции, а функция реализации встроена в место вызова
Я хотел бы понять, когда каждый из них происходит - или есть ли другие возможности.
Кроме того, имеет ли значение, если класс типа был определен в отдельно скомпилированном модуле, а не в составе «основной» единицы компиляции?
В работающей программе кажется, что Haskell знает типы всех функций и выражений в программе. Следовательно, когда я вызываю функцию класса типа, компилятор должен знать, что такое vtbl и какую именно функцию реализации вызывать. Я бы ожидал, что компилятор по крайней мере сгенерирует прямой вызов функции реализации. Это правда?
(Я говорю «запускаемая программа» здесь, чтобы отличить ее от компиляции модуля, который вы не запускаете.)