Im Allgemeinen wird foldl
zugunsten von foldl'
oder foldr
vermieden. Zitieren Real World Haskell :
Wegen des Thunking-Verhaltens von foldl ist es ratsam, dies zu vermeiden Funktion in realen Programmen: auch wenn es nicht scheitert, wird es unnötig ineffizient sein. Importieren Sie stattdessen Data.List und verwenden Sie foldl.
Einige Prelude-Funktionen sind jedoch in Bezug auf sie definiert (zB (\)
und unionBy
). Warum ist das? Ist es nicht zu streng zu diesen Funktionen?
Das Prelude wurde entworfen, bevor foldl'
existierten, und es gab Druck, die Abwärtskompatibilität (in Bezug auf Strenge, wie Sie erwähnt haben) seither aufrecht zu erhalten.
Im Falle von (\)
und unionBy
hat die gefaltete Funktion den Typ
und foo xs y
entfernen höchstens ein Element von xs
, also würde foldl'
im Allgemeinen dort nichts kaufen, die Thunks würden rechts von der obersten (:)
statt oberhalb dann gebaut werden.
Es würde keinen Unterschied in Bezug auf die Strenge machen, so weit ich sehen kann, würden beide Falten nur ausgewertet werden, wenn das Ergebnis zu einer schwachen Kopfnormalform ausgewertet werden muss, und wenn foldl'
ein% co_de erzeugen würde %, also _|_
.