Es kommt vom Sequenzpunkt . Das ist ein bekanntes Konzept in C, und es ist in der Tat dem seq
Operator in Haskell ziemlich ähnlich : Jede Berechnung auf der linken Seite sollte vor jeder Berechnung auf der rechten Seite durchgeführt werden .
Natürlich ist Haskell seq
etwas weniger anspruchsvoll als das: Es fordert lediglich, dass das Ding auf der linken Seite zu einer schwachen Kopfnormalform bewertet wird, bevor das Ergebnis auf der rechten Seite bewertet wird. Und es garantiert überhaupt keine bestimmte Bewertungsreihenfolge † , nur dass, wenn der Ausdruck links ⊥ ist, der rechts nicht ausgewertet werden darf.
Siehe pseq
oder deepseq
für stärkere Alternativen, die näher an das kommen, was C Sequenzpunkte nennt.
† Tatsächlich garantieren C- oder C ++ - Sequenzpunkte auch keine Berechnungsreihenfolge, nur dass alle Nebenwirkungen in der richtigen Reihenfolge vorliegen. In C sind Nebenwirkungen jedoch allgegenwärtig. Abgesehen von Optimierungen auf niedriger Ebene können Sie normalerweise davon ausgehen, dass die Reihenfolge der Sequenzpunkte beibehalten wird, während GHC tatsächlich ziemlich oft wegwirft seq
, wenn nur bekannt ist, dass die Ausdrücke nicht voneinander abweichen.
seq a b
: "evaluierenb
, danna
, dann zurückb
".a
⊥ ist, danna `seq` b
darf das Ergebnis von nicht zurückgegeben werdenb
.b
wenn es so wäre⊥
. Ich denke, zu sagen, dass Sie garantieren, dass esb
in keiner Weise "bewertet" (oder betrachtet) wird, ist irreführend und sogar praktisch falsch (und ich denke, es ist der zentrale Unterschied zupseq
). Ich denke, "das Ergebnisseq a b
notwendiger Kräfte zu erzwingena
undseq a b = b
wanna != ⊥
" ist genauer.b
wenn es so wäre⊥
" - das wäre in Haskell zumindest sinnvoll zu sagen, ohne auf eine Implementierung Bezug zu nehmen. Nur konnte man nicht wirklich das tun, im Allgemeinen - , weil es zunächst erforderlich wäre beweis , dieb
ist⊥
, und dafür müssen Sie tha Halteproblem zu lösen.seq a b = b
wanna != ⊥
" sagen und dann, um zu beschreiben, wie es tatsächlich dazu neigt, in GHC zu funktionieren, würde ich sagen "das Ergebnisseq a b
notwendiger Kräfte erzwingena
".