Qual dicionário o GHC escolhe quando mais de um está no escopo?
Considere o seguinte exemplo:
import Data.Constraint
class Bar a where
bar :: a -> a
foo :: (Bar a) => Dict (Bar a) -> a -> a
foo Dict = bar
O GHC tem duas opções para o dicionário usar ao selecionar umBar
instância emfoo
: poderia usar o dicionário doBar a
restrição emfoo
ou poderia usar o tempo de execuçãoDict
para obter um dicionário. Vejoessa questão por exemplo, onde os dicionários correspondem adiferente instâncias.
Qual dicionário o GHC usa e por que é a escolha "correta"?