В чем разница между (от 1 до 10 на 3) toList и (от 1 до 10 на 3) .toList в scala (или проблема с intellij?) - PullRequest
0 голосов
/ 22 ноября 2018

если этот вопрос глуп, пожалуйста, поймите.

Я начинаю изучать скалы с базовой грамматикой.

Но я не понимаю, почему одна ошибка, а другая нет.Я проверил это с помощью листа scala

val range = 1 to 10 by 3 toList
println(s"$range") //error

, но ниже приведен список (на самом деле Seq)

val range = (1 to 10 by 3).toList
println(s"$range") //no problem

Я использую Intellij 2018.2 Ultimate Edit.

Редактировать : изображение было изменено.Я приложил захват, который включен сообщение об ошибке, а не предупреждение.enter image description here

Редактировать : Я думал, что это проблема с целой версией, но все равно не работает

Ответы [ 2 ]

0 голосов
/ 22 ноября 2018

Если вы получаете эту ошибку ...

Ошибка: (2, 13) диапазон рекурсивных ленивых значений требует типа

... это потому что выВы используете инфиксную (без точек) нотацию, где вы не должны.

Поставьте пустую строку перед println() или точку с запятой после toList, и она будет работать.

Причина ошибки заключается в том, что instance.method(argument) можно превратить в ...

instance method argument

... но компилятор часто путается, если вы пытаетесь превратить instance.method в ...

instance method

Компилятор будет искать отсутствующие argument, пока не достигнет точки с запятой или пустой строки.

0 голосов
/ 22 ноября 2018

Либо должно работать.В scala вы можете опустить . с пробелом для вызова метода, который, вероятно, является неверной версией пути haskell.Я думаю, что пространство в scala не рекомендуется согласно официальному документу - РУКОВОДСТВО ПО СТИЛЮ - МЕТОД ИНВОКАЦИИ

Пример:

scala> val data = "guitar"
data: String = guitar

scala> data.toUpperCase
res8: String = GUITAR

Вы можете использовать пробел вместо .,

scala> data toUpperCase
<console>:13: warning: postfix operator toUpperCase 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 Scaladoc for value scala.language.postfixOps for a discussion
why the feature should be explicitly enabled.
       data toUpperCase
            ^
res9: String = GUITAR

Поскольку .toUpperCase используется после структуры данных без . (это называется Постфиксный оператор ), и компилятор просто предупреждает об этом.Это можно исправить, как говорится в предупреждении:

scala> import scala.language.postfixOps
import scala.language.postfixOps

scala> data toUpperCase
res10: String = GUITAR

То же самое относится и к вашему примеру.С точки зрения читабельности точка делает вас более читабельным.

scala> (1 to 10 by 3).toList
res9: List[Int] = List(1, 4, 7, 10)

ТАКЖЕ, операторы после исправления могут привести к ошибкам.Например, 1 + "11" toInt примените toInt в конце вычисления, но, возможно, я хотел получить 1 + "11".toInt

ТАКЖЕ, ТАКЖЕ в связи с вашей ошибкой, вам нужно кричать на компилятор, чтобы прекратить цепочку на toList с ; или новой строкой после оператора после исправления.Или вы можете использовать val, def после оператора пост-исправления, чтобы компилятор теперь знал, что это другой контекст.

scala> :paste

    import scala.language.postfixOps
    val range = 1 to 10 by 3 toList

    println(s"$range")

// Exiting paste mode, now interpreting.

List(1, 4, 7, 10)
import scala.language.postfixOps
range: List[Int] = List(1, 4, 7, 10)

Также читайте: Давайте отбросим постфиксные операторы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...