Arhn - архитектура программирования

Возможно ли сопоставление с образцом на Iterable

Это элегантный способ сопоставления шаблонов в коллекции scala Iterable[A], чтобы проверить, пуста ли она, содержит ли она ровно один элемент (и получить его), содержит ли она ровно N элементов (и получить их), если она содержит хотя бы один или более элементов (и получить их) и так далее.

С List это тривиально, но у меня нет эквивалента для работы Iterable.

11.10.2018

  • похоже, вы все равно всегда используете весь Iterable. если one element => get it, если iterable.size >=1 get it, если n elements => get it, это означает, что эти условия всегда будут истинными. Единственное, что вы пропустили, это 0 elem. 11.10.2018
  • это просто примеры возможных совпадений 12.10.2018

Ответы:


1

Вы хотите выполнить сопоставление с образцом следующим образом?

val it: Iterable[Int] = ...
it match {
  case Iterable(1, a, b) => ...
  case Iterable(a, b) => ...
  case Iterable() =>
}

Если да, на самом деле вы не можете этого сделать, потому что объект-компаньон Iterable не имеет метода unapplySeq. Поэтому самый простой способ сделать это — явно преобразовать Iterable в Seq:

val it: Iterable[Int] = ...
it.toSeq match {
  case Seq(1, a, b) => ...
  case Seq(a, b) => ...
  case Seq() =>
}

Или, если вы не хотите каждый раз вручную преобразовывать Iterable в Seq, вы можете использовать что-то вроде этого:

object iterable {
  def unapplySeq[A](it: Iterable[A]): Option[Seq[A]] = Some(it.toSeq)
}
val it: Iterable[Int] = ...
it match {
  case iterable(1, a, b) => ...
  case iterable(a, b) => ...
  case iterable() =>
}

Но имейте в виду, что базовая коллекция может не быть Seq. Такой подход может привести к копированию всего Iterable в новую коллекцию.

РЕДАКТИРОВАТЬ:

Iterable может быть бесконечным. В этом случае .toSeq может привести к сбою вашей программы. Таким образом, самым безопасным способом будет вызов .take(n) перед сопоставлением с образцом.

11.10.2018
  • Очень хорошие подсказки, спасибо. Обратите внимание, что toSeq не завершается для бесконечных коллекций Iterable. Мы можем сначала вызвать take(n), а затем toSeq или непосредственно toList и использовать сопоставление шаблонов списка. Я хотел сделать это прямо на Iterable, не конвертируя его, но это кажется невозможным. В любом случае, пожалуйста, измените свой ответ, мы сохраним его в документации самым безопасным и лучшим способом, который мы найдем. 12.10.2018

  • 2

    Как насчет этого:

       object Example extends App {
    
         val myIterable: Iterable[Int] = List(1,2).toIterable
    
         myIterable match {
            case Nil =>
                println(s" list is empty")
            case a::Nil =>
                println(s" list contains 1 elements $a")
            case a::b::Nil =>
                println(s" list contains 2 elements $a and $b")
        }
      }
    
    11.10.2018
  • Это работает только потому, что в вашем примере исходным объектом является список. Я думаю, что это не работает в общем случае, попробуйте, пожалуйста, с массивом, чтобы быстро проверить это. 12.10.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..