Кошки аппликативно поднимают значение "пусто" в опцию

Мне было интересно, есть ли способ поднять значения в 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) 
Другие вопросы по тегам