Woher hat die Haskell-Funktion `seq` ihren Namen?


8

Ich verstehe, dass dies seqverwendet wird, um die Leistung zu verbessern, indem unnötige Faulheit vermieden wird. Ich möchte nur wissen, woher der Name stammt. Ist es von "Sequenz" oder "sequentiell"? Und in welcher Beziehung steht der Name zur strengen Bewertung?

Antworten:


9

Es kommt vom Sequenzpunkt . Das ist ein bekanntes Konzept in C, und es ist in der Tat dem seqOperator 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 seqetwas 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 pseqoder deepseqfü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.


4
Ich glaube nicht, dass "wenn der Ausdruck links ⊥ ist, der rechts nicht ausgewertet werden darf". Siehe zum Beispiel wiki.haskell.org/Seq , wo eine rechtmäßige Implementierung von lautet seq a b: "evaluieren b, dann a, dann zurück b".
Oisdk

@oisdk Nun, es ist nicht wirklich sinnvoll, überhaupt über Evaluierung zu sprechen - dies ist nicht einmal ein definierter Begriff. Der Punkt ist, wenn a⊥ ist, dann a `seq` bdarf das Ergebnis von nicht zurückgegeben werden b.
Links um den

Mit "bewerten" meine ich "Kraft auf schwache Kopfnormalform". Außerdem denke ich immer noch, dass Ihre Erklärung nicht korrekt ist: Sie könnten das Ergebnis zurückgeben, bwenn es so wäre . Ich denke, zu sagen, dass Sie garantieren, dass es bin keiner Weise "bewertet" (oder betrachtet) wird, ist irreführend und sogar praktisch falsch (und ich denke, es ist der zentrale Unterschied zu pseq). Ich denke, "das Ergebnis seq a bnotwendiger Kräfte zu erzwingen aund seq a b = bwann a != ⊥" ist genauer.
25.

@oisdk, aber "Forcen" ist nichts, was Haskell weiß. - Ja, theoretisch könnte man "das Ergebnis zurückgeben, bwenn 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 , die bist , und dafür müssen Sie tha Halteproblem zu lösen.
Links um den

1
Sicher, "Forcen" ist kein Begriff, mit dem Sie die Semantik beschreiben können, aber auch nicht "Evaluieren", und ich versuche, eine Alternative zu den beiden Erklärungen zu präsentieren, die Sie gegeben haben: "Das Ding auf der linken Seite wird bewertet." schwache Normalform des Kopfes, bevor das Ergebnis rechts ausgewertet wird "," wenn der Ausdruck links ⊥ ist, dann darf der Ausdruck rechts nicht ausgewertet werden ", was ich beide für falsch halte. Für eine genaue Erklärung würde ich " seq a b = bwann a != ⊥" sagen und dann, um zu beschreiben, wie es tatsächlich dazu neigt, in GHC zu funktionieren, würde ich sagen "das Ergebnis seq a bnotwendiger Kräfte erzwingen a".
25.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.