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.