По моему мнению, это не будет перекрываться, так как
blockquote>[a]
не должен быть выбором, так как ограничение наJSON [a]
заключалось в том, чтоa
должен быть экземпляром самогоJSON
. Для(String, a)
нет экземпляраJSON
.Это недоразумение. GHC делает выбор экземпляра, учитывающий только головку экземпляра, а не какие-либо ограничения на экземпляры.
instance (JSON a) => JSON [a] where
означает, что для выбора экземпляра будет тот же, что и
instance JSON [a] where
также контекст
instance (JSON a) => JSON [(String, a)] where
игнорируется, например, для выбора.
Таким образом, GHC видит два экземпляра
instance JSON [a] instance JSON [(String, a)]
, и они оба соответствуют требуемому
instance JSON [(String, String)]
, что означает, что вы перекрываетесь (независимо от того, какие экземпляры действительно существуют и какие ограничения имеют каждый из двух экземпляров).
Если выбран экземпляр, то ограничения принимая во внимание, и если они не выполняются, это ошибка типа.