У меня есть код, структурно идентичный этому, и я не уверен, как лучше его очистить? Существуют тривиальные операции ввода-вывода и дополнения, поэтому пример компилируется без дополнительных методов.
Я бы действительно хотел, чтобы он не был таким вложенным, есть ли способ иметь сингл для понимания, который поддерживает как ввод-вывод, так и список? Я знаю, что существует OptionT для варианта этой проблемы, но похоже, что нет эквивалентного ListT.
Любой совет будет очень признателен
import cats.Traverse
import cats.effect.IO
import cats.implicits._
def exampleDoingSomeThings: IO[Unit] = for {
ids <- IO.pure(List(1, 2, 3))
_ <- ids.traverse[IO, Unit](id => for {
users <- IO.pure(List(id + 4, id + 5, id + 6))
data <- IO(id + 7)
otherData <- IO(id + 8)
_ <- users.traverse[IO, Unit](ud => for {
innerData <- IO(id + ud)
innerState <- IO(ud + 9)
_ <- if (innerState > 15) for {
_ <- IO(println(s"action1: $id $ud"))
_ <- IO(println(s"action2: $id $ud"))
} yield () else IO.pure()
} yield ())
} yield ())
} yield ()
exampleDoingSomeThings.unsafeRunSync
https://scalafiddle.io/sf/S79H1ZI/0