如何遍历 List[IO] 来执行一切并收集所有错误?

How to traverse List[IO] to execute everything and collect all errors?

例如,我有一个 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)

如果我使用遍历

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

它只打印 1,2,我可以得到一个错误“错误 3” 我想打印所有数字

1 
2
5

并获取所有错误的列表

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

我该怎么做?

解决方法:

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