Сопоставление шаблонов на поднятом типе (Slick Lifted Embedding)

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

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

Но предположим, что opt приходит в результате одного из запросов Slick и, следовательно, имеет тип встраивания с поднятым краем 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]
}

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


person Elie Bergman    schedule 08.10.2019    source источник


Ответы (1)


Вы можете использовать метод 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 по определению.

person francoisr    schedule 09.10.2019
comment
Тип Rep на самом деле не имеет определенной для него функции «карты». К сожалению, это решение не работает. val rep: Rep[Option[Int]] = Some(3) val boolRep = rep.map(.map( ‹ 10)) не компилируется - person Elie Bergman; 09.10.2019
comment
Вы правы, я ответил слишком быстро. Можете ли вы описать, чего вы на самом деле пытаетесь достичь, а не подзадачу, которую, по вашему мнению, вам нужно решить? Я имею в виду, с точки зрения запроса к базе данных, что вы хотите сделать? - person francoisr; 10.10.2019