Mein Ziel ist es, ()
von Begriffen wie folgt zu eliminieren:
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?
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:
Simplify1
macht einen Schritt der Vereinfachung. 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
). Simplify
beginnt erst mit einem Aufruf von SimplifyFix
. Simplify1
Da der Typ family Mustervergleich lazy ist, verzögert SimplifyFix
die Auswertung und verhindert Endlosschleifen.
Und tatsächlich:
%Vor%Tags und Links haskell infinite-loop type-families typechecking