Замените flatMap/ цепочку карт на для понимания

Я пытаюсь использовать для понимания следующего:

val s: Seq[Option[Int]] = //...
val t: Option[Int] = //...

s.map(sv => t.flatMap(tv => sv.map(_ == tv))) 

Я попробовал это:

val r: Seq[Option[Boolean]] = for(
  sv <- s;
  tv <- t;
  svv <- sv
) yield svv == tv //Seq[Boolean] does not conform to Seq[Option[Boolean]]

Есть ли способ написать в сжатой форме с for-comprehension?

2 ответа

Решение

Использование разных коллекций (сопротивляющихся сложному использованию М-слова здесь) в пределах одного и того же для понимания не рекомендуется, и это не будет работать в общем случае. Последовательность опций будет работать только потому, что Scala определяет некоторые неявные преобразования для таких ситуаций (поскольку они довольно распространены).

Вам гораздо лучше использовать два отдельных для понимания, одно для последовательности, а другое для варианта.

val s: Seq[Option[Int]] = List(Some(1), None, Some(2))
val t: Option[Int] = Some(2)

val result = for {
  elem <- s
} yield for {
  evalue <- elem
  tvalue <- t
} yield evalue == tvalue

println(result) // List(Some(false), None, Some(true))

Я бы, наверное, смешал вещи, чтобы все было просто и кратко:

val r: Seq[Option[Boolean]] =
  for (
    opt <- s;
    v <- t
  ) yield opt.map(_ == v)
Другие вопросы по тегам