Как обойти List [IO], чтобы выполнить все и собрать все ошибки?

#scala #scala-cats #cats-effect

#scala #scala-кошки #кошки-эффект

Вопрос:

Например, у меня есть список IO с некоторыми ошибками.

 def print(x: Int) = {
  if(x == 3 || x == 4) 
    IO.raiseError(new RuntimeException("error "   x))
  else 
    IO(println(x))
}

List.range(1,6).map(print)
  

Если я использую traverse

 List.range(1,6).map(print)
  

Он печатает только 1,2, и я могу получить одну ошибку «ошибка 3»
Я хотел бы напечатать все числа

 1 
2
5
  

и получить список всех ошибок

 List("error 3", "error 4")
  

Как я могу это сделать?

Ответ №1:

Решение:

 List.range(1, 6).traverse(print(_).attempt)
   .map(_.collect{case Left(x) => x})