scala параллельное множество рекурсивное значение нуждается в типе

У меня есть код из 'Scala в глубину', который работает в интерактивном редакторе:

(1 to 1000).par map { _ => Thread.currentThread.toString } toSet

Это печатает набор с потоками, которые использовались для этой параллельной операции. Все отлично работает, и тип результата - ParSet[String]

Но затем я пытаюсь использовать его в коде, и у меня есть это:

val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet
//val x = pthr.toSet
println("thread = " + pthr)

Это выдает: " error: рекурсивное значение pthr нуждается в типе" в строке println. Другое наблюдение, когда я раскомментирую вторую строку, все работает нормально, и в результате получается ParSet().

Что здесь происходит? Что такое тип переменной "pthr"?

2 ответа

println Метод ожидает строку, и вы предоставили строку с + оператор, чтобы pthr. Чтобы преобразовать pthr в строку, компилятору необходимо знать, какой это тип. Вы не указали тип в своем объявлении pthr, но вместо этого позволили сделать вывод. По какой-то причине логический вывод не работает, поэтому компилятор запрашивает явное объявление типа. Вы можете просто сделать это:

val pthr : Set[String] = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet

и это должно позаботиться об этом.

Однако я не могу воспроизвести ваши результаты с помощью Scala 2.11.2. Я получил:

scala> val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet
<console>:7: warning: postfix operator toSet should be enabled
by making the implicit value scala.language.postfixOps visible.
This can be achieved by adding the import clause 'import scala.language.postfixOps'
or by setting the compiler option -language:postfixOps.
See the Scala docs for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
       val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet
                                                                             ^
pthr: scala.collection.parallel.immutable.ParSet[String] = ParSet(Thread[ForkJoinPool-1-worker-29,5,main], Thread[ForkJoinPool-1-worker-19,5,main], Thread[ForkJoinPool-1-worker-13,5,main], Thread[ForkJoinPool-1-worker-3,5,main], Thread[ForkJoinPool-1-worker-27,5,main], Thread[ForkJoinPool-1-worker-5,5,main], Thread[ForkJoinPool-1-worker-1,5,main], Thread[ForkJoinPool-1-worker-23,5,main], Thread[ForkJoinPool-1-worker-15,5,main], Thread[ForkJoinPool-1-worker-11,5,main], Thread[ForkJoinPool-1-worker-21,5,main], Thread[ForkJoinPool-1-worker-9,5,main], Thread[ForkJoinPool-1-worker-7,5,main], Thread[ForkJoinPool-1-worker-17,5,main], Thread[ForkJoinPool-1-worker-31,5,main], Thread[ForkJoinPool-1-worker-25,5,main])

scala> println("thread = " + pthr)
thread = ParSet(Thread[ForkJoinPool-1-worker-29,5,main], Thread[ForkJoinPool-1-worker-19,5,main], Thread[ForkJoinPool-1-worker-13,5,main], Thread[ForkJoinPool-1-worker-3,5,main], Thread[ForkJoinPool-1-worker-27,5,main], Thread[ForkJoinPool-1-worker-5,5,main], Thread[ForkJoinPool-1-worker-1,5,main], Thread[ForkJoinPool-1-worker-23,5,main], Thread[ForkJoinPool-1-worker-15,5,main], Thread[ForkJoinPool-1-worker-11,5,main], Thread[ForkJoinPool-1-worker-21,5,main], Thread[ForkJoinPool-1-worker-9,5,main], Thread[ForkJoinPool-1-worker-7,5,main], Thread[ForkJoinPool-1-worker-17,5,main], Thread[ForkJoinPool-1-worker-31,5,main], Thread[ForkJoinPool-1-worker-25,5,main])

Кроме использования toSet Метод как оператор postFix, в коде нет ничего плохого, он компилируется и выполняется правильно. Возможно, вам стоит проверить свою версию компилятора?

Да, я знаю, что это работает в интерактивном scala но не во время компиляции scalac,

Хорошо, вот минималистичный пример, давайте назовем этот файл test.scala ":

//test.scala
object test {
  def main(args: Array[String]) = {
    val pthr = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet
    println("thread = " + pthr)
  }
}

Теперь выполним в терминале:

-> scalac test.scala                                              
test.scala:5: error: recursive value pthr needs type
println("thread = " + pthr)
                      ^
one error found

-> scalac -version                             
Scala compiler version 2.11.2 -- Copyright 2002-2013, LAMP/EPFL

Итак, снова у меня есть эта проблема только во время компиляции с scalac,

И когда я добавляю тип в pthr (val pthr: Set[String] = ...) тогда ошибка:

test.scala:4: error: type mismatch;
 found   : Boolean
 required: Set[String]
    val pthr:Set[String] = (1 to 1000).par map { _ => Thread.currentThread.toString } toSet
                                                                                  ^
one error found

Понятия не имею, что происходит:/

КСТАТИ. это точный код, скопированный со страницы "Глубина в скале", стр. 205.

Другие вопросы по тегам