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 emfooou 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"?

questionAnswers(3)

yourAnswerToTheQuestion