Списки соответствия шаблонов определенного размера или больше/меньше - программирование
Подтвердить что ты не робот

Списки соответствия шаблонов определенного размера или больше/меньше

Есть ли способ указать шаблон, который соответствует списку с размером больше (или меньше) или равным определенному значению в Scala?

Например, если я хочу применить одно и то же действие ко всем спискам размером 3 или менее:

list match {
    case Nil => op(list) 
    case x :: Nil => op(list)
    case x :: y :: Nil => op(list)
    case x :: y :: z :: Nil => op(list)
    case x :: tail => other(list)
} 

Есть ли способ уменьшить это до двух случаев?

4b9b3361

Ответ 1

Да, хотя вам нужно будет изменить порядок дел:

list match {
  case l @ (_ :: _ :: _ :: _) => other(l)
  case l => op(l)
}

Обратите внимание, что я привязал новую переменную l к списку в шаблоне вместо ссылки на list и что я использовал _, когда мне не нужна переменная. Я предлагаю придерживаться обеих этих практик, но ответ будет работать точно так же без них.

Ответ 2

Если вы настаиваете на использовании соответствия шаблону (возможно, вы хотите включить больше случаев совпадения?), вы можете использовать состояние защиты для него:

list match {
    case l if(l.size <= 3) => op(l)
    case l => other(l)
}

Ответ 3

Что не так с простым старым if/else??

if (list.length >= minimumLength)
  longer(list)
else
  shorter(list)

Ответ 4

Вы также можете сделать это с помощью

list.splitAt(len) match {
   case (xs, Nil) => other(xs)
   case (_, _) => op(list)
}

Также сложность O(len), даже если список длинный, len является решающим фактором.

Вышеупомянутые вызовы op, если list.size < len else вызывает other