Lesen Sie das Buch Real world Haskell
geting unter dem Beispiel überlappender Instanzen
Nach meinem Verständnis wird dies keine Überschneidung sein, da [a] keine Wahl sein sollte, da die Einschränkung für JSON [a] war, dass "a" eine Instanz von JSON sein muss. Es gibt keine Instanz von JSON für (String, a).
Nach meinem Verständnis wird dies keine Überschneidung sein, da
[a]
keine Wahl sein sollte, da die Einschränkung fürJSON [a]
war, dassa
eine Instanz vonJSON
sein muss. Es gibt keine Instanz vonJSON
für(String, a)
.
Das ist ein Missverständnis. GHC führt bei der Instanzauswahl nur den Instanzkopf und keine Einschränkungen für die Instanzen durch.
%Vor%bedeutet für die Instanzauswahl dasselbe wie
%Vor%auch der Kontext von
%Vor%wird für die Auswahl der Instanz ignoriert.
Somit sieht GHC die beiden Instanzen
%Vor%und beide entsprechen den erforderlichen
%Vor%bedeutet, dass Sie sich überlappen (unabhängig davon, welche Instanzen tatsächlich existieren und welche Einschränkungen jede der beiden Instanzen hat).
Wenn eine Instanz ausgewählt ist, werden die Einschränkungen berücksichtigt, und wenn sie nicht erfüllt werden, ist das ein Typfehler.
Diese existieren
%Vor%Es würde also Überschneidungen geben, selbst wenn GHC den Kontext berücksichtigt (siehe Daniel Fischers Antwort).