od projektowania kolekcji Scala Rozumiem, że coś takiego:wylesianie w kolekcji Scala
scala> BitSet(1,2,3) map (_ + "a")
res7: scala.collection.immutable.Set[String] = Set(1a, 2a, 3a)
nie buduje pośrednią datastructure: Nowy zestaw jest zbudowany jak BitSet się powtórzyć nad zastosowaniem Builder. W rzeczywistości w tym przypadku jest to oczywiste, ponieważ bitset ciągów znaków nie ma sensu.
Co z mapami z list? Jestem pewien, że dodaje się buduje listę pośredni:
scala> List(1,2,3) map (_ -> "foo") toMap
res8: scala.collection.immutable.Map[Int,java.lang.String] =
Map(1 -> foo, 2 -> foo, 3 -> foo)
mianowicie lista List((1,foo), (2,foo), (3,foo))
. Jeśli nie, to w jaki sposób? A co z następującymi?
scala> Map.empty ++ (List(1,2,3) map (_ -> "foo"))
res10: scala.collection.immutable.Map[Int,java.lang.String] =
Map(1 -> foo, 2 -> foo, 3 -> foo)
Tym razem, z tego, co wydaje mi się zrozumieć od rodzaju ++
:
def ++ [B >: (A, B), That]
(that: TraversableOnce[B])
(implicit bf: CanBuildFrom[Map[A, B], B, That]): That
myślę to może być przypadek, że mapa jest zbudowany na bieżąco, a które nie tworzona jest lista pośrednia.
Czy tak jest? Jeśli tak, czy jest to kanoniczny sposób zapewnienia wylesiania, czy też istnieje bardziej prosta składnia?
Wow, naprawdę potrzebowaliśmy 542 prób, aby to naprawić ;-) –
Dzięki, właśnie tego szukałem. Nie jestem pewien, dlaczego scala narzeka na 'List ((3, 4), (9, 11)) map (_. Swap): Map [Int, Int]' zamiast używać ograniczenia typu Mam jawnie umieścić, aby wybrać prawo niejawne (dokładnie tak, jak czyta wybiera właściwą instancję typu w haśle w zależności od kontekstu). Czy to jest tak, że implicit nie działa w ten sposób (całkowicie to rozumiem, wiem, że subtyping czyni wszystko trudnym), czy też przeoczyłem coś w tym szczególnym przypadku? –
@DuncanMcGregor: Nie zamknąłem REPL od ostatnich 5 dni. Używam go intensywnie w moim codziennym rozwoju. :-) – missingfaktor