deriving

___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ qstnhdr ___ Ableiten von Standardinstanzen mit GHC.Generics ___ tag123scrapyourboilerplate ___ Dieses Haskell-Paket enthält das Generika-System, das im Abschnitt "Scrap Your Boilerplate" beschrieben wird (siehe http://www.cs.uu.nl/wiki/GenericProgramming/SYB). Es definiert die Data-Klasse von Typen, die das Falten und Entfalten von Konstruktoranwendungen ermöglichen, Instanzen dieser Klasse für primitive Typen und eine Vielzahl von Traversalen. ___ tag123derivierung ___ In Haskell ist eine abgeleitete Instanz eine Instanzdeklaration, die automatisch in Verbindung mit einer Daten- oder Newtype- Deklaration generiert wird. Der Rumpf einer abgeleiteten Instanzdeklaration wird syntaktisch aus der Definition des zugehörigen Typs abgeleitet. ___ tag123genericprogramming ___ Eine Art der Programmierung, bei der Algorithmen abstrahierend von konkreten Datentypen implementiert werden. Gewöhnlich wird auf stark typisierte Sprachen Bezug genommen. Dieser Ausdruck wird normalerweise als eine Software betrachtet, die hinsichtlich der Anforderungen des Datentyps minimal ist und für jeden übereinstimmenden Datentyp instanziiert werden kann, ohne den Angerufenen-Code zu ändern. ___ qstntxt ___

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.

    
___ answer22851476 ___

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.

    
___
1
Antwort

Ableiten von Standardinstanzen mit GHC.Generics

Ich habe eine Typklasse Cyclic , 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...
03.04.2014, 23:39