Проблема синтаксиса Scala

#scala

#scala

Вопрос:

Следующий код может быть скомпилирован

   def isEven(a:Int)=
    if (a%2==0) true else false

  def main(args: Array[String]) {
        List(1, 10) filter isEven foreach println
  

но если я изменю на следующее (Список (1,10) —> Список (с 1 по 10))

 def isEven(a:Int)=
    if (a%2==0) true else false

  def main(args: Array[String]) {
        List(1 to 10) filter isEven foreach println
   }
  

В чем разница между List (1,10) и List (от 1 до 10)?

Комментарии:

1. Небольшое примечание: isEven (a) возвращает true, если (a%2==0) имеет значение true, и false, если оно равно false, поэтому оно эффективно возвращает (a % 2 == 0) — ничего более. И что насчет println ((1 to 10) filter isEven) ?

2. @user Я уже наполовину готов отказаться от голосования по этому вопросу только по этой строке кода. 🙂

Ответ №1:

List(1, 2) это просто список с двумя Int элементами: 1 и 2. Выражение 1 to 10 создает Range экземпляр, поэтому List(1 to 10) представляет собой список с одним элементом: a Range .

Ответ №2:

List(1, 10) является a, List[Int] тогда List(1 to 10) как List[Range] является a,,. Обратите внимание на типы в следующем сеансе REPL:

 scala> 1 to 10
res3: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(1, 2, 3, 4, 5, 6, 7
, 8, 9, 10)

scala> List(1 to 10)
res4: List[scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne] = List(Range(1, 2, 3,
 4, 5, 6, 7, 8, 9, 10))

scala> List(1, 10)
res5: List[Int] = List(1, 10)
  

Ответ №3:

missingfaktor прав, так что это всего лишь дополнение.

Если вам нужен a List[Int] с числами от 1 до 10, вы можете написать

 List(1 to 10:_*)
  

или

 1 to 10 toList