Рассмотрим следующий пример:
import Data.Constraint
class Bar a where
bar :: a -> a
foo :: (Bar a) => Dict (Bar a) -> a -> a
foo Dict = bar
GHC имеет два варианта использования словаря при выборе экземпляра Bar
в foo
: он может использовать словарь из ограничения Bar a
на foo
или он может использовать время выполнения Dict
для получить словарь. См. этот вопрос для примера, где словари соответствуют различным экземплярам.
Какой словарь использует GHC и почему он является "правильным" выбором?