Unendliche Rekursion beim Aufzählen aller Werte einer generischen Instanz

9

Für eine andere Antwort von mir schrieb ich den folgenden Code, wobei diagonal durchquert Universe Instanzen für aufzählbare Generic s (es ist etwas aktualisiert von der Version dort, aber verwendet die gleiche Logik):

%Vor%

( Omega ist wahrscheinlich nicht mit dem Problem verbunden, aber war Teil der Frage.)

Dies funktioniert für die meisten Typen, sogar rekursive wie diese:

%Vor%

Beispiele:

%Vor%

Beachten Sie jedoch, dass alle oben genannten Typen ihre rekursiven Konstruktoren nicht an erster Stelle haben! In der Tat (und das ist das Problem), das folgende divergiert:

%Vor%

Ich dachte zuerst, dass es vielleicht etwas mit der Bewertungsreihenfolge von Omegas gäbe, aber das Tauschen der linken und rechten Teile in der Zeile (2) macht nur T7 work und T6 fail, was ich tun würde erwarte als korrektes Verhalten.

Mein aktueller Verdacht ist, dass der Aufruf von universe in Zeile (1) zu früh ausgewertet wird. Zum Beispiel wird auch Folgendes geteilt, während in der Liste genau ein Wert sein sollte, der nicht einmal ausgewertet werden sollte:

%Vor%

Also, die einzige Instanz, T8 (T8 (...) ... ) , wird in der Liste ausgewertet, obwohl sie nicht benötigt wird! Ich habe keine Ahnung, woher dieser Effekt kommt - ist es die rekursive Verwendung seiner eigenen Universe Instanz? Aber warum verhalten sich "rekursive" Typen wie T6 korrekt, während "rekursive Links" ( T7 ) nicht funktionieren?

Ist das ein Problem der Strenge? Wenn ja, in welchem ​​Teil des Codes? Meine Universe Instanz? %Code%? Und wie man es repariert? Ich verwende GHC 7.6.3, wenn das wichtig ist.

    
phg 08.05.2014, 16:22
quelle

1 Antwort

1

Typen wie T8 können nicht generiert werden. Schauen wir uns an, um was sich die Generika-Version des Universums für T8 tatsächlich reduziert:

%Vor%

An keinem Punkt wird ein (:) oder [] erzeugt. Ohne einen anderen nicht-rekursiven Konstruktor, der erfolgreich produziert werden kann, gibt es keine Möglichkeit, Fortschritte zu machen. t8Universe hat genau so viele Elemente wie t8Universe , aber das ist zirkulär, und daher gibt es Evaluationsschleifen.

    
glguy 07.09.2015 20:55
quelle