Cette question a piqué ma curiosité, j'ai donc parcouru la base de code Scala et j'ai jeté un coup d'œil à mapConserves()
utilisations pratiques.
L'une d'entre elles est mentionnée à plusieurs reprises : Suivre facilement si l'opération map a effectué des changements réels (via une simple vérification de référence) si l'argument est une fonction partielle, comme dans cet exemple de Effacement :
def squashBoxed(tp: Type): Type = tp.dealiasWiden match {
case t @ RefinedType(parents, decls) =>
val parents1 = parents mapConserve squashBoxed
if (parents1 eq parents) tp
else RefinedType(parents1, decls)
// ...
Si aucune modification n'a été effectuée, le code peut empêcher l'exécution d'une opération coûteuse par la suite. Les alternatives pour ce cas d'utilisation avec la méthode map()
sont
- plus cher[1] : Itérer les deux listes et comparer leurs éléments par la suite
- ne fonctionne pas : Garder la trace dans la fonction partielle passée à
map()
s'il a effectué des changements en modifiant une sorte de drapeau externe -> Sideeffect, pas pur, pas la façon fonctionnelle de faire les choses ; également très laid en général.
[1] La question de savoir si cela est significatif dans une situation donnée dépend bien sûr, comme d'habitude, de la mesure des doutes avant l'optimisation. D'une manière générale, la méthode semble être moins utilisée de nos jours, ce qui pourrait indiquer qu'elle n'est généralement pas significative.