Se non si intende utilizzare il risultato di qualcosa, quindi archiviarlo pigramente e quindi non eseguirlo mai è più efficiente dell'esecuzione inutile. Questo è immediatamente ovvio.
Tuttavia, se si è eseguirlo, quindi memorizzarlo pigramente e quindi eseguirlo in seguito è meno efficiente rispetto alla semplice esecuzione in questo momento. C'è più indiretta coinvolti. Ci vuole tempo per annotare tutti i dettagli necessari per l'esecuzione, e ci vuole tempo per caricarli tutti quando ci si rende conto che è effettivamente necessario eseguire.
Questo è particolarmente il caso con qualcosa come l'aggiunta di due interi di larghezza della macchina. Se i tuoi operandi sono già nei registri della CPU, quindi aggiungerli immediatamente è una singola istruzione della macchina. Invece, abbiamo faticosamente messo tutte queste cose nell'heap, e poi recuperate in un secondo momento (probabilmente con un sacco di errori di cache e bancarelle di pipeline).
Oltre a questo, a volte un calcolo non è molto costoso e produce un piccolo risultato, ma i dettagli che dobbiamo memorizzare per eseguire il calcolo in seguito sono piuttosto grandi. L'esempio canonico sta sommando un elenco. Il risultato potrebbe essere un singolo intero a 32 bit, ma l'elenco da sommare potrebbe essere enorme! Tutto quel lavoro in più per il garbage collector per gestire questi dati che potrebbero essere altrimenti oggetti morti che potrebbero essere deallocati.
In generale, la pigrizia utilizzato destra può portare a guadagni di prestazioni di massa, ma la pigrizia utilizzato sbagliate risultati in disastri prestazioni spaventose. E la pigrizia può essere molto difficile da ragionare; questa roba non è facile. Con l'esperienza, ci si abitua gradualmente.
https://wiki.haskell.org/Foldr_Foldl_Foldl 'dovrebbe darti alcuni spunti – Bergi
Lazyness significa ulteriore calcolo e gestione della memoria. Dai un'occhiata a https://wiki.haskell.org/Performance/Data_types e https://wiki.haskell.org/Performance/Strictness – zigazou