почему scala компилирует ошибку в операторе if else? - PullRequest
0 голосов
/ 25 сентября 2019

это код scala:

def otpu (start : Int, end : Int) : List[Int] = {
  // TODO: Provide definition here.
  if(start<end)
    Nil
  else if(start>end){
     val list0:List[Int] = start::otpu(start-1,end)
     list0
  }
  else if(start==end){
    val list:List[Int] = List(end)
    list  
  }
}

Он работает как otpu(5,1)=> List(5,4,3,2,1)

Но когда я компилирую, я получаю ошибку компилятора type mismatch, found: unit,require:List[Int]" at "if(start==end)".

Когда я удаляю if(start==end) и есть только else , тогда он работает .

Почему он не работает с if(start==end)?

Ответы [ 3 ]

3 голосов
/ 25 сентября 2019

Обратите внимание на следующее.

val result = if (conditionA) List(9)

Это неполно.Что если conditionA равно ложно ?Каково значение result в этом случае?Компилятор решает эту проблему, молча конкурируя с оператором.

val result = if (conditionA) List(9) else ()

Но теперь появилась новая проблема.() относится к типу Unit.(Это значение типа only этого типа.) Ваш метод otpu обещает вернуть List[Int], но негласное предложение else этого не делает.Таким образом, ошибка.

1 голос
/ 25 сентября 2019

Как указано в других ответах, вы пропускаете последнее условие else.Вы можете получить это немедленно, если вы конвертируете код для использования сопоставления с образцом, например:

def otpu (start : Int, end : Int) : List[Int] = {
    start match {
        case `end` => List(end)
        case _ if start > end => start::otpu(start-1, end) 
        case _ => Nil
    }
}

РЕДАКТИРОВАТЬ:

Я заметил тег recursion в вопросе, и я подумал, что выВозможно, вы захотите получить рекурсивную функцию для этого.То, как вы реализовали рекурсивную функцию, на самом деле небезопасно из-за того факта, что для очень (очень) большого списка, который будет создан в выходных данных, вы можете столкнуться с ошибкой времени переполнения стека.Чтобы избежать этого, Scala дает вам возможность использовать хвостовые рекурсивные функции.Вот как это будет выглядеть:

def otpu(start: Int, end: Int) : List[Int] = {
  import scala.annotation.tailrec

  @tailrec
  def f(e: Int, acc: List[Int]): List[Int] = {
    start >= e match {
        // base step
        case false => acc
        // recursive step
        case true => f(e+1, e::acc) 
    }
  }

  // call the recursive function with the empty accumulator
  f(end, Nil)
}
1 голос
/ 25 сентября 2019

Ошибка компиляции из-за несоответствия типа возвращаемого значения в условиях if, elseif и else.Как и в приведенном выше коде else отсутствует, поэтому компилятор не может вернуть значение, если условие & elseif не выполнено.

def otpu(start: Int, end: Int): List[Int] = {
// TODO: Provide definition here.
if (start < end)
  Nil
else if (start > end) {
  val list0: List[Int] = start :: otpu(start - 1, end)
  list0
}
else if (start == end) {
  val list: List[Int] = List(end)
  list
}
 else Nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...