Meilleur moyen de marquer et de la somme en Scala?
Est-il une meilleure manière de faire ceci:
val totalScore = set.foldLeft(0)( _ + score(_) )
ou ceci:
val totalScore = set.toSeq.map(score(_)).sum
Je pense que c'est plutôt une opération commune ainsi m'attendais à quelque chose de plus lisse comme:
val totalScore = set.sum( score(_) )
Les deux premiers morceaux de code à faire des choses différentes. Voir mon commentaire de Daniel C. Sobral de réponse.
Merci @dsg, je l'ai changé.
Merci @dsg, je l'ai changé.
OriginalL'auteur adam77 | 2010-05-21
Vous devez vous connecter pour publier un commentaire.
Bien, il y a d'autres façons de l'écrire:
Le dernier peut exiger un point-virgule à la fin si la ligne suivante ne commence pas avec un mot-clé. On peut aussi utiliser
.view
au lieu de.toSeq
, ce qui permettrait d'éviter l'allocation temporaire de la collection. Cependant, je ne suis pas sûr de la.view
s'présente le comportement (en montrant les éléments répétés) est la bonne.Une préoccupation légitime avec l'approche en deux étapes peut être la représentation, il crée une seconde liste de somme. Toutefois, vous pouvez utiliser une vue d'éviter cela:
set.view.map(score).sum
. Séparer la question de la cartographie et en additionnant évite un coup de méthodes dans la bibliothèque standard. Si vous le faites souvent, vous pouvez ajoutermapAndSum
à votre propre code.Quelqu'un aurait-il un lien vers de la documentation sur les points de vue?
Ce code a un bug! À savoir, si
set
est en effet de typeSet[_]
etscore
attribue la même valeur à deux éléments deset
(c'est à direscore(a) = score(b)
oùa
,b
sont enset
eta != b
), alors ils ne sont comptés qu'une fois. Par conséquent, il n'est pas seulement que le "paresseux"set.view.map.(score(_)).sum
est plus performant, c'est en fait la seule façon correcte de le faire! (En fait je viens de rencontré ce bug dans mon code).Grande pêche. Si l'on peut toujours faire un
toSeq
à la place.OriginalL'auteur Daniel C. Sobral
Seq.sum
ne prend pas une fonction qui pourrait être utilisé pour marquer de la somme. Vous pouvez définir une conversion implicite qui "souteneurs"Traversable
:Veuillez noter que le
Numeric
trait n'existe que dans Scala 2.8.OriginalL'auteur Michel Krämer
De plus simple:
Avec votre score méthode:
Avertissement, cependant, cet échec est la collection en cours de réduction est vide tandis que le pli n'est pas:
score
), de sortereduceLeft
n'est pas une option.OriginalL'auteur Randall Schulz
Tour à tour, les
Seq#sum
surcharge qui prend une conversion implicite enNumeric
peut être utilisé si le type de la collection à être marqué /résumé n'est pas en elle-même un opérateur d'addition. Toutefois, parce que c'est une conversion implicite paramètre, il ne sera pas appliquée si nécessaire pour faire de l'réduire fermeture de type case.OriginalL'auteur Randall Schulz