Когда вы снова сопоставляете шаблоны списков, вы можете использовать Nil для проверки пустого списка. Однако, если базовый тип является Iterable, вы все равно можете проверить Nil, и он будет разбит на пустые наборы и т.д. См. Следующий сеанс REPL:
scala> val l: Iterable[Int] = List()
l: Iterable[Int] = List()
scala> l match {
| case Nil => 1
| case _ => 2
| }
res0: Int = 1
scala> val l: Iterable[Int] = Set()
l: Iterable[Int] = Set()
scala> l match {
| case Nil => 1
| case _ => 2
| }
res2: Int = 2
Вопрос: как я могу предотвратить такую проблему? Очевидно, что если l является списком типов, это не ошибка. И если l имеет тип Set, он не будет компилироваться. Но что, если у нас есть класс, который имеет список, определите функцию, которая соответствует шаблону таким образом, а затем кто-то изменит класс, чтобы вместо этого использовать общий итеративный вариант? Является ли этот шаблон Nil vs. _ плохой идеей?