Zusammenfassend zwei Optionen

7

Nehmen wir an, ich habe zwei optionale Ints (beide können Einige oder Keine sein):

%Vor%

Meine Frage ist die folgende: Gibt es eine intelligente Methode, um sie mit Scolas brillanten Sammlungsmethoden zu summieren? Mir ist klar, dass ich sie in eine Sammlung zusammenfassen könnte, flatten it und reduceLeftOption wie folgt verwenden:

%Vor%

Aber die obige Lösung bedeutet, eine neue Sammlung zu schaffen und in einer reichen und entwickelten Welt zu leben, die Zeit braucht von all den anderen Aktivitäten der Ersten Welt, in die ich mich eintauchen könnte. Und in einer Welt, in der das Programmieren für Programmierer wie uns immer luxuriöser wird, muss es eine oder mehrere luxuriöse Antworten auf die erste Welt geben, oder?

Bearbeiten: Um das zu verdeutlichen, hier einige Beispiele:

Wenn one = Some(1) und two = Some(2) , sollten wir Some (3)

haben

Wenn one = Some(1) und two = None , sollten wir Some (1)

haben

Wenn one = None und two = Some(2) wir sollten Some (2)

haben

Wenn sowohl one als auch two None sind, sollten wir keine haben, da weder one noch two korrekt summiert werden können.

Ich hoffe, dass die Dinge geklärt: -)

    
Jens Egholm 01.05.2013, 13:58
quelle

4 Antworten

12

obligatorische scalaz Antwort ist die Verwendung der Scalaz Option Monoid:

%Vor%

Es wird tun, was Sie wollen in Bezug auf keine:

%Vor%

Dass keine Methode eine Methode von scalaz ist, die bei der Typinferenz hilft, denn anstatt None <: Option[Nothing] zurückzugeben, gibt es eine Option[Int] , es gibt eine ähnliche Methode von Some, die eine Option [A] für ein beliebiges gegebenes A zurückgibt ein bisschen [A]:

%Vor%     
stew 01.05.2013, 14:08
quelle
15
%Vor%

Oder das weniger lesbare aber genau gleichwertig:

%Vor%

AKTUALISIEREN : Wie Ihr letzter Bearbeitungsschritt klarstellte, wollen Sie nur ein None als Ergebnis, wenn beide Eingabeoptionen None sind. In diesem Fall glaube ich nicht, dass Sie in Sachen Einfachheit etwas Besseres bekommen als das, was Sie bereits verwenden. Ich könnte es ein bisschen kürzen, aber insgesamt ist das das gleiche:

%Vor%     
Régis Jean-Gilles 01.05.2013 14:04
quelle
5

Wie wäre es mit:

%Vor%     
gzm0 01.05.2013 17:04
quelle
0

Du könntest das versuchen:

%Vor%     
cmbaxter 01.05.2013 14:04
quelle

Tags und Links