2017-07-05 3 views
0

Einfach üben/spielen mit Scala-Sammlungen und mit Partials. Obwohl ich nicht herausfinden kann, wie man match für flatMap eintippt, wenn Map einer Liste korrekt zugeordnet wird. Ich bin mir bewusst, es gibt andere Wege (zum Ende springen) nur neugierig, wie das funktionieren würde.Scala Collections Optionales Tuple flatMap

val fours = Map(1 -> 4, 2 -> 8, 3 -> 12) 
def greaterTuple(k:Int, v:Int):Option[(Int, Int)] = if(v > 4) Some(k,v) else None 

fours.flatMap { case (k,v) => greaterTuple(k,v) } //works 
fours.flatMap(x => greaterTuple(x._1, x._2))  //works 
fours.map((greaterTuple _).tupled)    //works 

fours.flatMap((greaterTuple _).tupled)  

Error:(27, 56) type mismatch; 
found : ((Int, Int)) => Option[(Int, Int)] 
required: ((Int, Int)) => scala.collection.GenTraversableOnce[?] 

So anders als die Änderung der Funktion Signatur etwas wie

def greaterTuple(t: (Int,Int)):Option[(Int,Int)] = if(t._2 > 4) Some(t) else None 

machen alles so einfach

fours.flatMap(greaterTuple) 
fours.map(greaterTuple) 

oder bevor jemand schlägt vor: inline die ganze Sache einfach nicht mein Punkt

fours.filter(t => t._2 > 4) 

Also wie tippst du es als optional ein?

Vielleicht sorgen Sie nicht und nur mit Ausnahme der oben genannten

fours.flatMap { case (k,v) => greaterTuple(k,v) } 

** Abgesehen warum gibt es so viel Beschwerde auf t._1/2/etc .. Wenn Sie jemals in den meisten Arbeiten mit einem einzelnes Tupel, um zu einer Funktion zu gelangen. Ich habe das Gefühl, dass es ein Teil der Sprache ist, die wir benutzen sollten, wenn es sonst Sinn macht und idiomatisch ist; Ende schimpfen.

+0

Was ist Ihre Frage? –

+0

Also wie tippst du es als optional ein? – JustDave

+1

Ich habe eine Bearbeitung meiner Antwort gepostet. –

Antwort

0

Scala Option ist nicht verfahrbar, also funktioniert flatMap nicht. Ein Option kann nicht in einen traversierbaren Prozess umgewandelt werden. Die Operation map gibt eine Iterable[Option[(Int, Int)]] zurück. 2.12 hat eine Operation flatten, die Sie auf das Ergebnis der map verwenden können. Es wird die leeren Option s herausfiltern und die nicht leeren in (Int, Int) konvertieren.

Ich bin nicht klar, was Sie mit dem flatMap erreichen wollen. Willst du eine Iterable[(Int, Int)]?

bearbeiten:

ich übersehen implicit Option.option2Iterable: Option[A] => Iterable[A] und @ justdave Syntax falsch war.

scala> fours.flatMap((greaterTuple _).tupled(_)) 
res0: scala.collection.immutable.Map[Int,Int] = Map(2 -> 8, 3 -> 12) 

Siehe auch this.

+0

Yup, wollte nur wissen, ob es möglich war und wenn nicht warum, was du antwortest. – JustDave