Scala "match" help

Я изучаю некоторый код scala и нашел этот метод, который меня озадачивает. В инструкции match, что такое конструктор [email protected]? какую ценность он содержит? когда я напечатал его без diff, чем tail, но если я заменил его на хвост, функция вернет результат diff. Может кто-нибудь объяснить, что это такое, и указать мне на правильный ресурс, чтобы понять это? (Я знаю, что могу искать в google, но не знаю, что искать..)

def flatMapSublists[A, B](ls: List[A])(f: (List[A]) => List[B]): List[B] =
    ls match {
      case Nil => Nil
      case [email protected](_ :: tail) => f(sublist) ::: flatMapSublists(tail)(f)
    }

Ответ 1

Я бы назвал это "съел твой пирог и у него тоже был оператор". На любом уровне в сопоставлении с образцами вы можете дать часть имени (до @) и деконструировать ее дальше (после @). Например, представьте, что вы хотите сопоставлять List с 3 элементами, вам нужен второй элемент, но вы хотите зарегистрировать весь список:

something match {
  case [email protected](_,elem,_) => log("matching:" + list); elem    
  case _ => error("not found")
}   

Без этой функции вам нужно было написать что-то вроде

something match {
  case List(a,elem,b) => log("matching:" + List(a,elem,b)); elem    
  case _ => error("not found")
}   

Как вы можете видеть, нам нужно назвать первый и третий элементы, просто потому, что нам нужны они, чтобы получить список с той же структурой с правой стороны, который является шаблоном. Гораздо проще и понятнее, если вы можете дать все имя (list), а также части, более глубокие в структуре (elem), когда вам нужно как с правой стороны.

Ответ 2

В этом случае подписок становится именованной переменной для всего списка (_ :: tail). хвост - это, ну, хвост списка. Я не уверен, есть ли здесь имя '@'.

Я действительно не вижу цели подписок здесь, так как вы можете просто ссылаться на ls напрямую.

Отказ от ответственности: я новичок в scala. Надеюсь, я прав.