В Scala, почему возникает следующее при использовании функции toSet
от TraversableOnce
?Scala TraversableOnce and toSet
При создании рабочего листа (в IntelliJ) с помощью следующего кода вы получите следующий вывод (NB: с помощью Scala 2.10.2):
val maps = List(List(1,2),List(3,4),List(5,6,7),List(8),List())
maps.flatMap(_.map(_ + " "))
maps.flatMap(_.map(_ + " ")).toSet
maps.flatMap(_.map(_ + " ")).toSet()
т.е. res4 производит логическое
> maps: List[List[Int]] = List(List(1, 2), List(3, 4), List(5, 6, 7), List(8), List())
> res2: List[String] = List("1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ")
> res3: scala.collection.immutable.Set[String] = Set("3 ", "8 ", "4 ", "5 ", "1 ", "6 ", "2 ", "7 ")
> res4: Boolean = false
Излишне говорить, что я был смущен достаточно долго, пока не заметил, что toSet
не использует круглые скобки в реализации, но почему логическое?
Глядя на скомпилированном байткоде, что на самом деле происходит - результирующий набор применят метод получил колл с Единичный аргумент, но не могу сказать, почему. Похоже на ошибку, поскольку она не воспроизводится, если я пытаюсь вызвать '()' on res3 –