Gibt es einen guten Grund, warum die check
-Funktion in der Contol.Concurent.STM
-Bibliothek den Typ Bool -> STM a
hat und undefined
bei Erfolg zurückgibt, anstatt den Typ Bool -> STM ()
? Wie es implementiert wird, kompiliert der Typprüfer polity einen Do-Block, der mit check foo
endet und nur zur Laufzeit mit *** Exception: Prelude.undefined
fehlschlägt.
Es sieht so aus, als wäre es eine Platzhalterdefinition für ein GHC PrimOp , wie die "Definition" seq _ y = y
, das vom Compiler mit dem eigentlichen primitiven Implementierungscode ersetzt wird. Die PrimOp-Implementierung von check
nimmt einen Ausdruck und fügt ihn einem globalen hinzu Liste der Invarianten wie im STM-Invariantenpapier beschrieben .
Hier ist ein super-konstruiertes Beispiel, das von diesem Papier modifiziert wurde, um dem neuen Typ von check
zu entsprechen:
Realistisch wäre dies nützlich, um Invarianten im gemeinsamen Status zu behaupten, bei denen das Versagen der Behauptung ein Zeichen für eine vorübergehende Inkonsistenz sein könnte. Sie könnten dann mit der Erwartung erneut versuchen, dass diese Invariante schließlich wieder wahr wird, aber da dieses Beispiel die Invariante dauerhaft aufbricht, ruft es nur retry
für immer auf und scheint zu hängen. Schauen Sie sich das Papier für viel bessere Beispiele an, aber bedenken Sie, dass sich der Typ seit seiner Veröffentlichung geändert hat.