Ich habe eine Typklasse %code% , für die ich generische Instanzen bereitstellen möchte.
%Vor%Gegeben eine Summenart von Nullkonstruktoren,
%Vor%Ich möchte eine Instanz erzeugen, die dieser entspricht:
%Vor%Ich habe versucht, die erforderliche %code% -Maschinerie wie folgt auszuarbeiten
%Vor%Jetzt kann ich Standardimplementierungen für %code% mit %code% :
bereitstellen %Vor%aber meine %code% Instanzen sind falsch. Verwenden von %code% von oben
%Vor%Es ist klar, warum %code% hier %code% entspricht. %code% berechnet die %code% -Struktur von %code% erneut, bis sie den Basisfall %code% erreicht.
Es wurde in %code% vorgeschlagen, Konstruktorinformationen von %code% zu verwenden, damit %code% den nächsten Konstruktor auswählen kann, auf den man rekursiv zugreifen kann, aber ich bin nicht sicher, wie ich das machen soll.
Ist es möglich, die gewünschten Instanzen von %code% mit %code% oder einer anderen Form von Scrap Your Boilerplate zu erzeugen?
BEARBEITEN: Ich könnte %code% mit %code% und %code%
schreiben %Vor%aber (wie es ist) ist dies unbefriedigend, da es alle %code% , %code% und %code% erfordert. Darüber hinaus kann %code% in einigen Fällen nicht automatisch von GHC abgeleitet werden, wohingegen %code% robuster ist.
Bearbeitet nach dem erneuten Lesen, was %code% bedeuten soll, und erneut versuchen, die Produkt von zwei Zyklen Problem
Sie können herausfinden, wann Sie zur anderen Seite einer Summe von Konstruktoren gehen müssen, wenn Sie wissen, dass das, was drin ist, bereits beim letzten Konstruktor ist, was die neuen Funktionen %code% und %code% tun. Ich kann mir keine zyklische Gruppe vorstellen, für die wir %code% nicht definieren können.
Sie können %code% für Summen implementieren, ohne die Werte zu prüfen. Die Erweiterung %code% hilft dabei. Ich habe die Signaturen geändert, um Proxies zu verwenden, da Sie nun %code% mischen und versuchen, einen Wert in Ihrem Code zu dekonstruieren.
%Vor%Hier ist die %code% Klasse mit %code% , defaults und %code% (anstelle von %code% ) für %code%
%Vor%Und die Klasse %code% und ihre Implementierungen:
%Vor%Ich kann nicht genug betonen, dass das Folgende eine Äquivalenzklasse über mehrere zyklische Untergruppen des Produktes der zwei Zyklen macht. Aufgrund der Notwendigkeit, Enden für Summen zu erkennen, und das Gesicht, dass die Berechnungen für %code% und %code% nicht faul sind, können wir nicht mehr Spaß machen, wie eine zyklische Instanz für %code% abzuleiten.
%Vor%Hier sind einige weitere Beispiele:
%Vor%Und ein paar Beispielcode zum Ausführen:
%Vor%Das vierte und fünfte Beispiel zeigen, was passiert, wenn wir eine Instanz für das Produkt zweier zyklischer Gruppen erstellen, deren Ordnungen nicht gleichzeitig sind.