Die Haskell-STM-Prüffunktion gibt undefined zurück

9

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.

    
John F. Miller 03.12.2011, 01:58
quelle

1 Antwort

5

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:

%Vor%

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.

    
acfoltzer 03.12.2011, 02:54
quelle

Tags und Links