9
votes

Résumant deux options

Disons que j'ai deux INT facultatifs (les deux peuvent être certains ou aucun):

(one :: two :: Nil).flatten.reduceLeftOption(_ + _)     // Some(3)


4 commentaires

Merci pour l'édition Ben James, peut-être que je suis juste vieux et grincheux, mais j'avais un mal de tête "du premier monde" lisant la version originale ...


Journée internationale des travailleurs régis. Une fois par an. Ne sois pas si petit :-)


Pourquoi supprimer le commentaire de la Journée internationale des travailleurs? Vous n'avez pas de style ..


À peu près un duplicata: Stackoverflow.com/questions/17188123/... :) Plus d'infos Il y a au moins;)


4 Réponses :


22
votes
(one ++ two).reduceOption(_ + _)

6 commentaires

Excellente réponse, monsieur. Mais si un n'est pas, tout le résultat n'est pas, non?


Oh, à droite, vous vouliez obtenir 0 au cas où l'option est Aucun ? Ensuite, ajoutez simplement un getorelse (0) à la fin. Ou mieux encore, il suffit de faire one.getorelse (0) + deux.getorelse (0) .


En fait, je préférerais d'obtenir aucun, si tous les deux n'en étiaient pas. Mais si le premier (un) est néancière et le second (deux) est un peu (2) (par exemple), je préférerais certains (2). Le code ci-dessus ne renvoie aucun.


J'ai compris. Je pense que dans ce cas chaque réponse jusqu'à présent est effectivement incorrecte alors. C'est une exigence rare.


Que diriez-vous de (un ++ deux) .Reduçition (_ + _) alors? C'est fondamentalement que vous possédez le code, seulement légèrement raccourci.


Bien que j'aime Scalaz, cela devrait être la réponse, car c'est une doublure simple qui ne nécessite aucune bibliothèque externe.



0
votes

Vous pouvez essayer ceci:

for( x <- one.orElse(Some(0)); y <- two.orElse(Some(0))) yield x+y


2 commentaires

one.map (deux.getorelse (0) + _) est incorrect: si deux est nucle Vous obtiendrez quelques (1) de aucun.


Ya, j'ai attrapé ça et modifié ma réponse



15
votes

La réponse à Scalaz obligatoire consiste à utiliser l'option Scalaz monoïde: xxx pré>

Il fera ce que vous voulez en ce qui concerne NONE: P>

scala> 1.some |+| 2.some
res3: Option[Int] = Some(3)


5 commentaires

Merci, c'est génial! Il semble juste que l'on veut légèrement surkill pour importer une nouvelle bibliothèque. Je vais l'accepter si rien de mieux montre :-)


Fais-le! Scalaz est une très première bibliothèque I Ajouter à n'importe quel projet. Une fois que vous avez commencé à vous y habituer, vous trouverez qu'il y a des tonnes de gemmes là-bas, vous ne voudrez pas vivre sans :)


Merci d'avoir répondu. Ça a vraiment l'air propre. On dirait que je devrai passer plus de temps avec Scalaz :-)


Voici une belle vidéo d'introduction qui commence par des monoïdes de notre propre @Oxbow_lakes: CompétencesMatter.com/ Podcast / Scala / Pratique-Scalaz-2518


Merci! Comme une autre option, les chats de la bibliothèque ont fonctionné pour moi. importer des chats.implicites ._



6
votes

Que diriez-vous:

one.map(_ + two.getOrElse(0)).orElse(two)


0 commentaires