2012-02-07 9 views
13

Właśnie widziałem mogę zrobić:Scala: Co znaczy zdać ustawione na funkcję mapy zestawu

Set(1, 2, 3).map(Set(1)) 

który daje wynik:

Set(true, false) 

Myślałam że funkcja mapy może przyjąć tylko inną funkcję, a nie nowy zestaw. Jeśli cokolwiek bym oczekiwał, to zwróci zestaw zbiorów. Co się dzieje i co oznacza wynik?

Odpowiedz

18

Ale myślałem, że funkcja map może tylko inny nie działać nowa Set.

A Setto funkcja. Jest to funkcja od swoich elementów do booleans: kiedy przekazujesz element, mówi ci, czy ten element jest częścią Set.

Set(1, 2, 3).map(Set(1)) 

iteracyjnie w Set(1, 2, 3) uboczny co każdy element do Set(1). To znaczy. najpierw prosi "jest 1 członkiem zbioru {1}", który jest true, następnie zadaje to samo pytanie 2 i 3, które jest false.

Rezultatem jest Set(true, false, false), co oczywiście jest po prostu Set(true, false).

Podobnie, sekwencja jest funkcją z liczb całkowitych do elementów, a mapa jest funkcją z klawiszy do wartości.

5
  • Set[A] przedłuża Function1[A, Boolean].
  • Map[K, V] rozszerza PartialFunction[K, V], który z kolei rozszerza Function1[K, V].
  • Seq[A] rozszerza PartialFunction[Int, A], który z kolei rozszerza Function1[Int, A].

Tak więc w bibliotece zbiorów Scala same zestawy, sekwencje i mapy są funkcjami.

  • apply Metoda w Set[_] testów ustaw członkostwo.
  • apply Metoda w Map[_, _] zwraca wartość skojarzoną z danym kluczem. Zgłasza błąd, jeśli klucz jest nieobecny.
  • apply Metoda w Seq[_] zwraca element z danego indeksu. Zgłasza błąd w przypadku nieprawidłowego indeksu.

Poniżej dwa są równoważne:

Set(1, 2, 3).map(Set(1)) 

Set(1, 2, 3).map(x => Set(1).contains(x)) 

Więc są dwa następujące:

Seq(1, 2, 3).collect(someMap) 

Seq(1, 2, 3) collect { 
    case x if someMap contains x => someMap(x) 
} 

a także następujących dwóch:

Seq(1, 2, 3).map(someSeq) 

Seq(1, 2, 3).map(x => someSeq(x))