2013-04-26 12 views
48

Czy istnieje sposób, używając tylko interfejsu API Scala, aby uzyskać opcję na liście podczas próby pobrania elementu przez jego indeks?Jak uzyskać opcję z indeksu w kolekcji w Scali?

Szukam odpowiednika tej funkcji, czy istnieje?

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

Dzięki

Odpowiedz

104

Tak, można podnieść swoją kolekcję do funkcji Int => Option[A]:

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

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

Nice! dzięki Ci! – Loic

+10

Już widziałem 'lift' dla dużej ilości danych w Scali, jakie jest uzasadnienie nazewnictwa (i abstrakcji)? – kosii

+2

@kosii może nieco spóźniony z odpowiedzią, ale w tym przypadku "podnieś" odnosi się do transformacji z częściowej funkcji typu 'Int => T' do całkowitej funkcji typu' Int => Opcja [T] '. Jest to dość powszechny termin na przekształcenie z czegoś mniej ogólnego na coś bardziej ogólnego lub, innymi słowy, "dodanie" nowej struktury, np. przekształcenie monady w transformator monadowy lub przekształcenie funktora w wolną monadę. Myślę, że termin ten pochodzi z teorii kategorii, ale nie mogłem znaleźć żadnych konkretnych odniesień. –