Декомпозиция сопоставления с образцом объекта в списке в Vavr - PullRequest
0 голосов
/ 28 марта 2019

Есть ли возможность применить декомпозицию объекта к коллекциям vavrs?

Т.е. что-то вроде этого фрагмента кода из scala:

val x = List(1, 2, 3)

val t = x match {
  case List(a, b, c) => (a, b, c)
}

(в этом примере мы конвертируем список в кортеж)

Я видел здесь несколько примеров, похожих на мой случай https://github.com/vavr-io/vavr/issues/1157, но похоже, что текущий синтаксис отличается или даже невозможен.

1 Ответ

2 голосов
/ 28 марта 2019

Vavr Списки, как и во многих функциональных программах, состоят из головы (один элемент, называемый Cons) и хвоста (другой список), можно сопоставить первые элементы (не последние, кроме как путем обращения списка в обратном порядке). ), хотя это будет более многословно, чем Scala / Haskell. Кроме того, хотя вы можете сопоставлять 3 первых элемента, вы можете ЗАПИСАТЬ только первые:

var t = Match(x).of(
  Case($Cons($(), $Cons($(), $Cons($(), $()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);

Документация Vavr сопоставления с образцом и его ограничения :

Текущий API делает компромисс, что все шаблоны соответствуют, но только корневые шаблоны разлагаются.

Редактировать: Если вы хотите, чтобы в списке было ровно 3 элемента, вам нужно убедиться, что хвост после третьего элемента представляет собой пустой список (называемый Nil):

var t = Match(x).of(
  Case($Cons($(), $Cons($(), $Cons($(), $Nil()))), (a, tail) -> Tuple(a, tail.head(), x.get(2)))
);
...