Warum heißt die Funktion zur Einführung von Strenge seq?


8

Ich verstehe die seq- Funktion und warum es notwendig ist, Strenge für Effizienz einzuführen. Was ich nicht verstehe ist, warum heißt dieses Primitiv seq(und hat nichts mit Strenge zu tun)?


4
Ich denke, es kommt von "Sequenz" wie in "Bewerten Sie dies, bevor Sie das bewerten". Wenn dies der Ursprung ist, ist es ein sehr irreführender Name, da er nicht garantiert, dass das erste Argument vor dem anderen bewertet wird.
Chi

Antworten:


8

TL; DR: Miranda nannte es seq, es wurde eingeführt, als sequencees (wahrscheinlich) schon eine Sache für Monaden war, und ($!)war strictfür kurze Zeit bekannt.

Miranda war die Erste

Es wird genannt, seqweil es seqin Miranda und früheren Sprachen genannt wurde, zumindest gemäß A History of Haskell: Faul mit der Klasse von Paul Hudak, John Hughes, Simon Peyton Jones und Philip Wadler .

Beide seqund strenge Komponenten von Datenstrukturen waren in Miranda bereits aus den gleichen Gründen vorhanden (Turner, 1985), und zwarseq seit den frühen 1980er Jahren verwendet, um Platzlecks in faulen Programmen zu beheben (Scheevel, 1984; Hughes, 1983).

Beachten Sie, dass Turner nur die strengen Komponenten in der Veröffentlichung von 1985 eingeführt hat , nicht seqselbst, und Scheevels "NORMA Sasl-Handbuch" scheint verloren zu sein oder zumindest nicht im Internet verfügbar zu sein. Hughes These ("Hughes, 1983" oben) führt nicht einseq .

In seqbeiden Fällen war es Teil der Mirandas-Standardumgebung und enthält auch einen Hinweis, warum es aufgerufen wurde seq:

`seq 'wird auf zwei Werte angewendet, gibt den zweiten zurück, prüft jedoch, ob der erste Wert nicht vollständig undefiniert ist. Manchmal erforderlich, z. B. um eine korrekte Synchronisation in interaktiven Programmen sicherzustellen.

Die korrekte Synchronisation oder seq uss auf .

Andere mögliche Namen

Warum wurde das nicht einfach strictin Haskell genannt? Oder sogar sequence?

Nun, es stellt sich heraus, dass Haskell 1.3 , das eingeführt wurde seq, auch eingeführt hat Monad, und somit sequence :: Monad m => [m a] -> m (). Daher sequencewar kein Name verfügbar.

Nun, das sequencewar nicht im Bild, schauen wir uns das an strict. strictwurde in 1.3 aufgenommen, da 1.3 eine EvalTypklasse einführte :

seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)

Weder Evalnoch stricthat Haskell98 so wie es ist geschnitten. Stattdessen wurde Evales vollständig entfernt, da es für alle Typen in beiden Fällen gilt, und strictin umbenannt ($!).


1
Hinweis: Ich habe diese Antwort mehrmals von Grund auf neu geschrieben, wenn ich auf eine neue Quelle gestoßen bin, die das Thema etwas besser beleuchtet. Beachten Sie auch, dass Sie Ihre geistige Gesundheit verlieren, wenn Sie versuchen, die alten Haskell-Versionen 1.0 und 1.1 in einer modernen LaTeX-Umgebung auszuführen. Glücklicherweise ist weder 1.0, 1.1 noch 1.2 enthalten seq, und 1.3 verfügt über eine ordnungsgemäße .psHTML-Version. Wenn Sie wissen möchten, warum monadische E / A gefeiert wurden, schauen Sie sich das alte E / A- [Request] -> [Response]Modell an. Faul mit der Klasse zu sein, ist wahrscheinlich die beste Quelle, um weiter zu schauen, abgesehen von alten Sitzungsprotokollen.
Zeta
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.