Czytając książkę Real world Haskell
geting poniżej przykład z nakładających przypadkachNakładające się przypadki, w 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")]
Według mojego rozumienia tego nie będzie nakładających się, jak [a] nie powinien być wybór, ponieważ ograniczenie JSON [a] był taki, że "a" musi być samą instancją JSON. Nie ma instancji JSON dla (String, a).
dzięki za bardzo szczegółowe wyjaśnienie –
Przy okazji: nieco później w książce zaznacza się, że można użyć "pragnienia OverlappingInstances", aby "rozwiązać" "problem" opisany w tej odpowiedzi. Osobiście nie rozumiem, dlaczego tak jest. Mam nadzieję, że zignoruje to pewnego dnia. – Brendan