Какой словарь выбирает GHC, когда в области видимости находится несколько?
Рассмотрим следующий пример:
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, и почему это «правильный» выбор?