Angenommen, ich habe folgende Memo-Funktionen. (Ignoriere die Tatsache, dass sie bitte rein sind.)
%Vor%Jetzt möchte ich ein Konstrukt haben, das es mir erlaubt, das "Beste" der obigen drei Memo-Funktionen zu wählen. Etwas, das im Wesentlichen folgendes bewirkt:
%Vor%Sie können dies mit Typklassen versuchen, aber Sie erhalten überlappende Instanzen:
%Vor% Ich habe auch versucht, cast
zu verwenden, um die Einschränkungen abzurufen. Mir ist klar, dass dies zur Laufzeit passieren würde und wie mir in #haskell gesagt wurde, ist das wahrscheinlich eine schlechte Idee. (Ich habe die Fälle für memoOrd
und memoHash
aus Gründen der Kürze weggelassen.)
Dieser Code generiert die folgende Fehlermeldung:
%Vor% Durch das Verschieben der Eq a
-Einschränkung in Maybe
tritt ein zusätzlicher Fehler auf, dass es keine Typeable1
-Einschränkung für Gl.
Konnte nicht ableiten (Typable1 Eq), die sich aus einer Verwendung von "Cast" ergibt aus dem Kontext (Typable a, Typable b)
Was ich erreichen möchte, vielleicht mit Template Haskell? Oder ist es völlig unmöglich und unerwünscht, dies zu können?
In der GHC-Implementierung von Typklassen (und im Allgemeinen) ist es nicht möglich, Klassenwörterbücher zur Laufzeit nachzuschlagen. Der Algorithmus zum Erzeugen eines Wörterbuchcodes ist in die Typ-Inferenzmaschine des Compilers integriert, und es gibt keinen entsprechenden Algorithmus in irgendeinem Laufzeitcode. Soweit ich weiß, gibt es keine Laufzeitdatenbank aller Klasseninstanzen, die Sie benötigen, um diesen Algorithmus zu implementieren. Das Design-Prinzip dahinter ist, dass Typen keine Daten sind, also kann ein Programm sie nicht untersuchen.
Außerdem ist es nicht möglich, zur Kompilierzeit die beste Memo-Methode zu wählen, da das Typklassensystem die Definition neuer Instanzen erlaubt. Da Sie nicht beweisen können, dass ein Typ nicht ein Mitglied von Hashable
ist - vielleicht liegt die Instanzdefinition in einer Datei vor, die noch nicht kompiliert wurde - dies kann nicht ausgeschlossen werden Jeder Typ sollte basierend auf der Hashable
-Klasse notiert werden. Das gleiche gilt für Eq
und Ord
.
Ich denke, die beste Lösung besteht darin, manuell festzulegen, wie jeder Typ memoisiert wird, indem Memo
instances für jeden Typenkonstruktor geschrieben wird.
Tags und Links haskell template-haskell