Gibt es eine scala Identitätsfunktion?
-
22-09-2019 - |
Frage
Wenn ich so etwas wie ein List[Option[A]]
haben und ich möchte diese in eine List[A]
konvertieren, der normale Weg ist die Verwendung flatMap
:
scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))
scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)
Jetzt o => o
ist nur eine Identitätsfunktion. Ich würde es habe gedacht, irgendeine Weise zu tun:
l.flatMap(Identity) //return a List[String]
Allerdings kann ich diese nicht an der Arbeit, da Sie nicht ein object
generify können. Ich habe versucht, ein paar Dinge ohne Erfolg; hat, so etwas zu arbeiten?
Lösung
Es gibt eine Identität Funktion in Predef .
l flatMap identity[Option[String]]
> List[String] = List(Hello, World)
A für expresion ist schöner, nehme ich an:
for(x <- l; y <- x) yield y
Edit:
Ich habe versucht, herauszufinden, warum die der Typparameter (Option [String]) benötigt wird. Das Problem scheint die Typumwandlung von Option [T] zu Iterable [T] zu sein.
Wenn Sie definieren die Identitätsfunktion als:
l.flatMap( x => Option.option2Iterable(identity(x)))
kann der Typ-Parameter weggelassen werden.
Andere Tipps
FWIW, auf Scala 2.8 Sie rufen Sie einfach flatten
darauf. Thomas es meist hat für Scala 2.7 abgedeckt. Er verpasste nur eine Alternative Art und Weise, dass die Identität der Verwendung:
l.flatMap[String](identity)
Es wird nicht mit Operator Notation Arbeit, aber (es scheint Notation Bediener nicht Typparameter akzeptieren, was gut ist zu wissen).
Sie können auch Aufruf flatten
auf Scala 2.7 (auf einem List
zumindest), aber es wird ohne einen Typen nicht in der Lage sein, etwas zu tun. Doch diese Arbeiten:
l.flatten[String]
Sie könnten nur die Art Rückschließer eine wenig Hilfe geben:
scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))
scala> l.flatten[String]
res0: List[String] = List(Hello, World)