Warum sind einige Prelude-Funktionen in Bezug auf foldl definiert?

8

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?

    
amindfv 20.11.2012, 14:06
quelle

3 Antworten

13

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.

    
Daniel Wagner 20.11.2012, 14:52
quelle
10

Im Falle von (\) und unionBy hat die gefaltete Funktion den Typ

%Vor%

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 _|_ .

    
Daniel Fischer 20.11.2012 15:13
quelle
4

In beiden Fällen ist der Akku vom Typ [a] . Ich kann nicht sehen, dass das Erzwingen der Liste auf die Normalform des schwachen Kopfes einen großen Unterschied machen würde, und die Einführung einer solchen Teilstrenge erscheint etwas willkürlich.

    
kosmikus 20.11.2012 15:12
quelle

Tags und Links