Читая книгу Real world Haskell
Geting ниже пример перекрывающихся экземпляровПерекрытие экземпляры в Haskell
instance (JSON a) => JSON [a] where
toJValue = undefined
fromJValue = undefined
instance (JSON a) => JSON [(String, a)] where
toJValue = undefined
fromJValue = undefined
ghci> toJValue [("foo","bar")]
<interactive>:1:0:
Overlapping instances for JSON [([Char], [Char])]
arising from a use of `toJValue' at <interactive>:1:0-23
Matching instances:
instance (JSON a) => JSON [a]
-- Defined at BrokenClass.hs:(44,0)-(46,25)
instance (JSON a) => JSON [(String, a)]
-- Defined at BrokenClass.hs:(50,0)-(52,25)
In the expression: toJValue [("foo", "bar")]
In the definition of `it': it = toJValue [("foo", "bar")]
По моему пониманию это не будет перекрытием, так как [а] не должен быть выбор, так как ограничение JSON [a] заключался в том, что «a» должен быть экземпляром JSON. Для JSON нет экземпляра (String, a).
благодарит за очень подробное объяснение –
К слову: чуть позже в книге указывается, что вы можете использовать прагму «OverlappingInstances» для «решения» проблемы, описанной в этом ответе. Лично я не понимаю, почему так оно и есть. Надеюсь, когда-нибудь я его выпью. – Brendan