Endlosschleife für Typreduzierung

8

Mein Ziel ist es, () von Begriffen wie folgt zu eliminieren:

%Vor%

Und das ist der Code:

%Vor%

Aber probiere es aus:

%Vor%

... führt zu einer Endlosschleife im Typchecker. Ich denke, die If type Familie sollte sich um irreduzible Begriffe kümmern, aber mir fehlt offensichtlich etwas. Aber was?

    
Philip Kamenarsky 08.09.2016, 16:37
quelle

2 Antworten

10

Die Typ-Familienbewertung ist nicht faul, also wird If c t f alle c , t und f auswerten. (Tatsächlich ist die Art der Familienbewertungsreihenfolge momentan noch nicht wirklich definiert.) Es ist also kein Wunder, dass Sie eine Endlosschleife haben - Sie bewerten Simplify (op (Simplify x) (Simplify y)) immer, selbst wenn das Simplify (op x y) ist!

Sie können dies vermeiden, indem Sie die Rekursion und die Vereinfachung wie folgt aufteilen:

%Vor%

Die Idee ist:

  1. Simplify1 macht einen Schritt der Vereinfachung.
  2. SimplifyFix übernimmt x und seine einstufige Vereinfachung x' , prüft, ob sie gleich sind, und wenn dies nicht der Fall ist, führt sie einen weiteren Schritt der Vereinfachung durch (und findet den Fixpunkt von Simplify1 ).
  3. Simplify beginnt erst mit einem Aufruf von SimplifyFix .
  4. die Kette Simplify1

Da der Typ family Mustervergleich lazy ist, verzögert SimplifyFix die Auswertung und verhindert Endlosschleifen.

Und tatsächlich:

%Vor%     
Antal Spector-Zabusky 08.09.2016, 16:55
quelle
3

Ich dachte, ich würde erwähnen, dass die Vereinfachung die Struktur einer Falte hat. Daher ist es nicht notwendig, diese komplexe Lösung mit einem Fixpunkt zu erstellen, der den Ausdruck immer wieder neu durchläuft.

Das wird gut gehen:

%Vor%     
gallais 09.09.2016 12:25
quelle