Вот моя попытка 3-й задачи (P03) из 99 проблем в Scala (http://aperiodic.net/phil/scala/s-99/):Scala Pattern Matching Энигма
import scala.annotation._
// Find the nth element of a list.
// nth(2, List(1, 1, 2, 3, 5, 8)) = 2
object P03 {
@tailrec def nth[A](n: Int, ls: List[A]): A = (n, ls) match {
case (0, h :: t :: Nil) => h
case (n, _ :: t) => nth(n - 1, t)
case _ => println(n); throw new IllegalArgumentException
}
Загадка в том, что этот код печатает -4
и бросает IllegalArgumentException
решение, конечно, изменить первый рисунок на:
case (0, h :: _) => h
Это печатает правильный ответ 2
Вопрос: почему? Что такое тонкое различие между:
case (0, h :: t :: Nil) => h
&
case (0, h :: _) => h
Спасибо!
Разница в том, что 'h :: t :: Nil' соответствует только списку с двумя элементами (' h' и 't',' Nil' является маркером для конца списка), а 'h :: _' соответствует каждому непустому списку, то есть списку, который имеет хотя бы один элемент. –
Можете ли вы добавить это как ответ вместо комментария. Я хотел бы отметить это как ответ и закрыть его :). Благодарю. – iyerland