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 sequencees (wahrscheinlich) schon eine Sache für Monaden war, und ($!)war strictfür kurze Zeit bekannt.
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 zwarseqseit 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 .
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 ($!).
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.