3 votes

Cas d'utilisation Scala mapConserve

Hier, j'ai découvert scala mapConserve ici à SO : scala List map vs mapConserve

Ma question est la suivante : quand quelqu'un veut-il utiliser cette méthode ? Les exemples fournis utilisent mapConserve avec la fonction identity, et je ne vois pas de cas d'utilisation...

Editer : a effectué une recherche rapide sur GitHub et a trouvé 816 blocs de code Scala qui utilisent mapConserve. Et beaucoup d'entre eux (au moins 3 pages) sont ce bloc de code :

  def checkStackOverflow() = {  
    var xs: List[String] = Nil
    for (i <- 0 until 250000)
        xs = "X" :: xs

    val lowers = xs.mapConserve(_.toLowerCase)
    assert(xs.mapConserve(x => x) eq xs)
  }

3voto

alextsc Points 1273

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X