Сопоставление с образцом на поднятом типе - PullRequest
0 голосов
/ 09 октября 2019

Если бы я хотел сопоставить шаблон с базовым типом опции в Scala, я бы запустил что-то вроде

val opt = Option(5)
val lessThanTen = opt match {
    case Some(e) => if (e < 10) true else false
    case None => None
}

Но предположим, что opt происходит в результате одного из запросов Слика, и поэтомуимеет тип поднятого вложения Rep[Option[Int]] Как можно выполнить такое же сопоставление с образцом таким образом, чтобы мы могли видеть внутри поднятого типа? Т.е. что-то вроде

val opt = Rep(Option(5))
val lessThanTen = opt match {
    case Rep[Some(e)] => Rep[if (e < 10) true else false]
    case Rep[None] => Rep[None]
}

Но, конечно, тот, который компилируется;)

1 Ответ

1 голос
/ 09 октября 2019

Вы можете использовать метод map, чтобы применить некоторые операции к содержимому Rep.

val rep: Rep[Option[Int]] = ???
val boolRep = rep.map {
    case Some(i) => Some(i < 10)
    case None => None
}

Еще лучше: Option, как и многие другие типы коллекций в Scala, также имеет аналогичный метод map, поэтому вы можете написать

val boolRep = rep.map(_.map(_ < 10))

В этом выражении первый _ - это Option[Int], а второй - сам Int. В случаях, когда Option[Int] равен None, метод map не имеет к чему применить данную функцию, поэтому он возвращает None по определению.

...