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:
Bearbeiten: Da es scheint, dass dies nicht direkt gemacht werden kann, was sind einige gute Workarounds, die getan werden können?
Dies kann mit der Implementierung von Dynamic
in der open-typeRep -Bibliothek erfolgen (wenn Sie akzeptieren mit generischer Programmierung und vielen GHC-Erweiterungen).
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.)