Кошки аппликативно поднимают значение "пусто" в опцию
Мне было интересно, есть ли способ поднять значения в Option, имея, например, представление об их пустоте
import cats._, cats.data._, cats.implicits._
Applicative[Option].pure(List.empty[String])
дает
res1: Option[List[String]] = Some(List())
Но я не хочу, чтобы это возвращалось None
в этом случае, потому что список пуст. Может быть полезно и с пустой строкой.
1 ответ
Чтобы это сделать, вам нужно реализовать Emptiness как класс типов. Тогда реализация лифта будет довольно простой
def liftOption[A : Empty](a: A): Option[A] =
if (Empty[A].isEmpty(a)) None else Some(a)
Были некоторые дискуссии о том, помещать это в кошек или нет, и теперь это находится в переулках
Тогда на самом деле вы можете распространить его на каждый Applicative
который может быть Empty
(вам может потребоваться внести некоторые коррективы, чтобы типы соответствовали пустым, но это иллюстрирует идею):
def liftE[A: Empty, F[_]: Applicative, Empty](a: A): F[A] =
if (Empty[A].isEmpty(a)) Empty[F]
else Applicative[F].pure(a)