Исключение времени выполнения во время выполнения функции

Я пытаюсь запустить функцию в scala

 def sum(xs: List[Int]): Int = xs match {
  case Nil => throw new java.util.NoSuchElementException("Minimum number of elements")
  case x :: xs => x + sum(xs)
}

Когда я пытаюсь бежать вот так,

sum(List(1,2,3))

Я получаю исключение во время выполнения

java.util.NoSuchElementException: Minimum number of elements
  at .sum(<console>:12)
  at .sum(<console>:13)

С другой стороны, это работает

def sum(xs: List[Int]): Int = xs match {
case Nil => 0
case x :: xs => x + sum(xs)
}

person Srinivas    schedule 24.07.2017    source источник


Ответы (1)


List(1,2,3) эквивалентно 1::2::3::Nil

поэтому ваша функция оценивается в следующем порядке

sum(1::2::3::Nil) = 1 + sum(2::3::Nil)
sum(2::3::Nil) = 2 + sum(3::Nil)
sum(3::Nil) = 3 + sum(Nil)

и, наконец, sum(Nil) выдает исключение.

Вы можете получить больше информации из следующего вопроса.

Почему Nil требуется в конце списка, созданного с помощью оператора cons

Зачем нам нужен Nil при создании List в scala?< /а>

person ymonad    schedule 24.07.2017