Я пытаюсь изменить код, который использует проверку кошек, что-то вроде:
case class Example(text: String, image: String)
case class ValidExample(text: String, image: String)
import cats.data.Validated._
import cats.implicits._
def validText(text: String) = if (text.nonEmpty) text.valid else invalid(-1)
def validImage(image: String) = if (image.endsWith(".png")) image.valid else invalid(-1)
val e = Example("test", "test.png")
(validText(e.text), validImage(e.image)).mapN(ValidExample)
, который работает нормально.
Но мое изменение требует, чтобы поле изображения было Option, как:
case class Example(text: String, image: Option[String])
case class ValidExample(text: String, image: Option[String])
import cats.data.Validated._
import cats.implicits._
def validText(text: String) = if (text.nonEmpty) text.valid else invalid(-1)
def validImage(image: String) = if (image.endsWith(".png")) image.valid else invalid(-1)
val e = Example("test", Some("test.png"))
(validText(e.text), e.image.map(validImage)).mapN(ValidExample)
При этом mapN завершается сбоем, потому что типы внезапно различаются, он говорит:
value mapN is not a member of (cats.data.Validated[Int,String], Option[cats.data.Validated[Int,String]])
Я хочу, чтобы он проверялся только при наличии значения.Таким образом, он должен быть частью результата проверки, если значение присутствует, но игнорировать поле в противном случае.Я знаю, что есть несколько способов объединения проверок, но в моем реальном коде это было бы намного сложнее, чем что-то подобное.
Есть ли способ сделать это простым способом?Я не смог ничего найти об этом в документах или в поиске.
Спасибо за помощь!