C'est une syntaxe yield-like de Ruby (même si je pense que c'est pomper d'un autre langage) ?
Version imprimable
On peut faire plus explicite tout en étant concis
Le fait d'être verbeux n'apporte pas tout le temps de la clarté. Très souvent en Scala, le code colle de très près à l'algo, il y a très peu de code de contexte comme la déclaration de variables temporaires. Après à etre trop concis, on en perd de la clarté, je suis d'accord.Code:
1
2 values.foldLeft(0)((result: Int, current: Int) => result + current)
En faite c'est surtoutque je trouve pas super explicite. Ca renvoie quoi ? Une collection ? Un itérateur ?Code:foldLeft(0)
Et j'aurais préféré un truc du genreoù opération prend un élément du type de la collection en paramètre et renvoie un type quelconque. Le résultat étant du type résultant de l'opération.Code:collection.join(operation)
Ou alorsdans ce cas operation prend toujours le même paramètre mais ne renvoie rien.Code:collection.apply(operation)
L'opérateur fold est un opérateur classique sur les collections dans les langages fonctionnels. Ensuite pour comprendre ce que retourneil faut connaître un peu scala. En gros ça retourne une fonction qui accepte un paramètre de type fonction et retourne un entier (dans ce cas précis). Scala ici n'a rien inventé, mais a juste les opérateurs fonctionnels classiques tel que map, filter, foreach, foldLeft, foldRight… qui sont ma foi très pratiques !Code:foldLeft(0)
Il faut juste se faire à la logique fonctionnelle, mais c'est très agréable et pratique
Ok ! J'avais fait un peu d'Haskell mais rien de bien méchant. Je n'avais jamais utilisé "fold".
Je suppose que 0 c'est le premier indice et "left" indique le sens de parcours ? On ne peut donc que renvoyer un int ?
0 c'est la valeur initial. A chaque appel, on prend le résultat de l'appel précédent
Cela dit c'est une méthode générique dont tu peux renvoyer ce que tu veux. Il se base sur le type du premier lot de paramètres (le(0))
Voici sa signature:
A étant le type d'objet contenu dans la listeCode:
1
2 def foldLeft[B](z: B)(f: (B, A) => B): B