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)?
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)?
Antworten:
TL; DR: Miranda nannte es seq
, es wurde eingeführt, als sequence
es (wahrscheinlich) schon eine Sache für Monaden war, und ($!)
war strict
für kurze Zeit bekannt.
Es wird genannt, seq
weil es seq
in 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
seq
und 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 seq
selbst, 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 seq
beiden 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 .
Warum wurde das nicht einfach strict
in 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 sequence
war kein Name verfügbar.
Nun, das sequence
war nicht im Bild, schauen wir uns das an strict
. strict
wurde in 1.3 aufgenommen, da 1.3 eine Eval
Typklasse einführte :
seq :: Eval a => a -> b -> b
strict :: Eval a => (a -> b) -> (a -> b)
strict f = \x -> seq x (f x)
Weder Eval
noch strict
hat Haskell98 so wie es ist geschnitten. Stattdessen wurde Eval
es vollständig entfernt, da es für alle Typen in beiden Fällen gilt, und strict
in umbenannt ($!)
.
seq
, und 1.3 verfügt über eine ordnungsgemäße .ps
HTML-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.