Évaluation paresseuse
Calcul différé jusqu'à ce que le résultat soit réellement nécessaire. Par défaut en Haskell (call-by-need). Manuel dans les langages stricts via thunks/générateurs/itérateurs. Permet des structures de données infinies et évite le travail inutile.
Haskell : take 5 [1..] prend 5 éléments d'une liste infinie — seuls ces 5 sont calculés. JavaScript : les générateurs (function*) apportent la paresse. Python : itérateurs + itertools.islice. Rust : les méthodes de chaînage d'Iterator sont paresseuses. Compromis : la paresse complique le raisonnement sur la performance et la mémoire (les thunks s'accumulent en mémoire). Problème classique en Haskell : la « fuite d'espace » — des chaînes de thunks qui grossissent sans limite faute d'être forcées. Les langages stricts par défaut proposent une paresse en opt-in explicite là où ça vaut le coup : let lazy_val = lazy { expensive_computation() }.