2013-04-26 9 views
48

Gibt es einen Weg, nur die Scala Collection-API zu verwenden, um eine Option in einer Liste zu erhalten, wenn versucht wird, ein Element nach seinem Index zu bekommen?Wie bekomme ich eine Option aus dem Index in Collection in Scala?

Ich bin auf der Suche nach dem Äquivalent dieser Funktion, gibt es sie?

def optionalValue[T](l: List[T], index: Int) = { 
    if (l.size < (index+1)) None 
    else Some(l(index)) 
} 

Dank

Antwort

104

Ja, Sie Ihre Sammlung auf eine Funktion Int => Option[A] heben kann:

scala> List(1,2,3).lift 
res0: Int => Option[Int] = <function1> 

scala> List(1,2,3).lift(9) 
res1: Option[Int] = None 
+0

Nice! Danke! – Loic

+10

Ich habe bereits 'Lift' für eine Menge Datenstruktur in Scala gesehen, was ist der Grund für die Namensgebung (und die Abstraktion)? – kosii

+2

@kosii vielleicht ein bisschen spät mit der Antwort, aber in diesem Fall bezieht sich "Lift" auf die Transformation von einer Teilfunktion vom Typ Int => T zu einer Gesamtfunktion vom Typ Int => Option [T]. Es ist ein ziemlich gebräuchlicher Ausdruck für die Umwandlung von etwas weniger allgemeinem in etwas allgemeineres, oder mit anderen Worten, das Hinzufügen einer neuen Struktur, z.B. Umwandlung einer Monade in einen Monadentransformator oder Umwandlung eines Funktors in eine freie Monade. Ich denke, der Begriff kam aus der Kategorientheorie, aber ich konnte keine eindeutigen Referenzen finden. –