Scala для понимания результата работы с картой прибывает как Int

Пожалуйста, посмотрите на приведенный ниже код,

`

val d= for{
      t <- db.getSomething()
      ids <- t.map(_.id).toSeq
      histo <- fetchOtherRelatedDetails(ids)
    } yield histo

`

Здесь db.getSomething возвращает Future[Seq[SomeObject]], поэтому я пытаюсь извлечь объект и затем отобразить его идентификаторы в список, а затем хочу вызвать другую функцию, которая обработает идентификаторы для получения результата в Future. Проблема с компилятором заключается в ids как Int, который должен быть Seq[Int]

Я делаю что-то неправильно?

1 ответ

Решение

На первый взгляд, у вас есть несоответствие типов для понимания:

for {
  t <- db.getSomething()
  ids <- t.map(_.id).toSeq
  histo <- fetchOtherRelatedDetails(ids)
} yield histo

это desugars для

db.getSomething().flatMap { t =>
  t.map(_.id).toSeq.flatMap { ids =>
//^_______________________^ 
// the return type of this expression is Seq[A], but Future[A] is expected
    fetchOtherRelatedDetails(ids).map(histo => histo)
  }
}

Как отмечено в строке, вы не можете вернуть Seq где Future ожидается. Другими словами, все выражение справа от <- должен иметь общий "контейнер" (Future в данном случае) для проверки на проверку типов.

В этом конкретном случае вы можете исправить это с помощью назначения вместо flatMap (<-)

for {
  t <- db.getSomething()
  ids = t.map(_.id).toSeq
  histo <- fetchOtherRelatedDetails(ids)
} yield histo
Другие вопросы по тегам