При повторном сопоставлении списков вы можете использовать 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 является типом List, это не ошибка. И если l имеет тип Set, он не скомпилируется. Но что, если у нас есть класс со списком, определим функцию, которой соответствует шаблон, и затем кто-то изменит класс, чтобы вместо него использовать универсальный итератор? Совпадает ли этот шаблон «ноль против _» с плохой идеей вообще?