Qu'est-ce que la Scala de syntaxe pour l'addition d'une Liste d'objets?
Par exemple
case class Blah(security: String, price: Double)
val myList = List(Blah("a", 2.0), Blah("b", 4.0))
val sum = myList.sum(_.price) //does not work
Quelle est la syntaxe pour l'obtention de la somme?
- Quel est le message d'erreur dit?
- Voir issues.scala-lang.org/browse/SI-4276
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Ou alternativement:
Vous semblent être en train d'essayer d'utiliser cette méthode:
et le compilateur ne peut pas comprendre comment la fonction que vous proposez est une instance de
Numeric
, car il n'est pas.Scalaz a cette méthode, sous un nom
foldMap
. La signature est:Utilisation:
B
ici ne doit pas être un type numérique. Il peut être tout monoïde. Exemple:Comme une alternative à missingfaktor de Scalaz exemple, si vous voulez vraiment pour faire la somme d'une liste de objets (par opposition à la cartographie chacun d'eux à un nombre, puis en additionnant ces nombres), scalaz prend en charge cette ainsi.
Cela dépend de la classe en question disposer d'une instance de Monoïde définis pour (ce qui en pratique signifie qu'il doit avoir une Zéro et un Semigroup défini). Le monoïde peut être considéré comme un affaiblissement de la généralisation de base de scala
Numeric
trait spécifiquement pour additionnant; après tout, si vous pouvez définir un zéro et un moyen d'ajouter/de combiner deux éléments, alors vous avez tout ce dont vous avez besoin pour obtenir la somme de plusieurs objets.Scalaz " la logique est exactement la même que la façon dont vous feriez la somme des entiers manuellement -
list.foldLeft(0) { _ + _ }
- sauf que lesZero
fournit à zéro initiale de l'élément, et laSemigroup
prévoit la mise en œuvre de+
(appeléappend
).Il pourrait ressembler à quelque chose comme ceci:
Dans ce cas
mySum
sera en fait une instance de Bla égal àBlah("ab", 6.0)
, plutôt que d'être simplement un Double.OK, pour cet exemple particulier, vous n'avez pas vraiment de gain que beaucoup parce que l'obtention d'une "somme" des noms de sécurité n'est pas très utile. Mais pour d'autres classes (par exemple, si vous avez eu une quantité aussi bien qu'un prix, ou de plusieurs propriétés pertinentes) cela peut être très utile. Fondamentalement, il est grand temps que si vous pouvez définir une certaine manière d'ajouter deux instances de la classe ensemble, vous pouvez dire scalaz à ce sujet (par la définition d'un
Semigroup
); et si vous le pouvez définir un zéro de l'élément de trop, vous pouvez utiliser cette définition pour facilement somme des collections de votre classe.