Ermittlung der Implementierung der Methode basierend auf verfügbaren Einschränkungen

8

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.)

%Vor%

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.

gibt
  

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?

    
Alessandro Vermeulen 29.05.2013, 13:20
quelle

1 Antwort

12

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.

    
Heatsink 29.05.2013, 14:44
quelle

Tags und Links