Kombinieren von Data.Dynamic- und type-Klassen

8

Ist eine Variable vom Typ Dynamic erlaubt, die Typklassen der internen Variablen zu nutzen, ohne den genauen Typ zu berücksichtigen? Nehmen wir zum Beispiel an, ich möchte eine Funktion prettyShow schreiben. Wenn der interne Typ eine Instanz von Show ist, sollten wir diese Instanz verwenden; Andernfalls sollten wir die Instanz der Klasse Dynamic verwenden. Im Code könnte dies wie folgt aussehen:

%Vor%

Bearbeiten: Da es scheint, dass dies nicht direkt gemacht werden kann, was sind einige gute Workarounds, die getan werden können?

    
Mike Izbicki 05.04.2014, 03:50
quelle

1 Antwort

6

Dies kann mit der Implementierung von Dynamic in der open-typeRep -Bibliothek erfolgen (wenn Sie akzeptieren mit generischer Programmierung und vielen GHC-Erweiterungen).

%Vor%

Die Definition von show ist einfach und Sie können die Bibliothek verwenden, um andere Funktionen über dynamische Werte zu definieren.

Im obigen Beispiel habe ich ein geschlossenes Universum Type verwendet. Mit Datentypen à la Carte-Tricks können Sie aber auch Funktionen für offene Universen definieren. Zum Beispiel ist show selbst offen.

Leistung

Ein einfacher Benchmark zeigt an, dass Dynamic 2-3 ist Mal langsamer als Data.Dynamic in base für das oben verwendete kleine Typuniversum. Wenn das Universum auf 30 Typkonstruktoren erhöht wird, ist es etwas mehr als 10 mal langsamer.

Automatische Ableitung für neue Typen

open-typerep unterstützt das Erstellen von Universen aus einer kleinen Anzahl von vordefinierten Darstellungstypen. Es sollte prinzipiell möglich sein, TemplateHaskell zum automatischen Ableiten von Repräsentationen für neue Typen zu verwenden, aber es wird schwierig sein, die richtigen Instanzen für Witness und PWitness zu generieren, da diese davon abhängen, welche anderen Instanzen verfügbar sind. ( Witness wird beispielsweise von der Show -Instanz für Dynamic verwendet.)

    
emilaxelsson 10.04.2014, 13:19
quelle

Tags und Links