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):
( 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:
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.
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:
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.
Tags und Links haskell strictness ghc-generics