当我写作时
println(List[String Either Int](Left("Boom"), Right(42)).flatten)
编译器提示
ScalaFiddle.scala:16: error: No implicit view available from Either[String,scala.this.Int] => collection.this.GenTraversableOnce[B].
println(List[String Either Int](Left("Boom"), Right(42)).flatten)
^
ScalaFiddle.scala:16: error: not enough arguments for method flatten: (implicit asTraversable: scala.this.Function1[Either[String,scala.this.Int],collection.this.GenTraversableOnce[B]])immutable.this.List[B].
Unspecified value parameter asTraversable.
println(List[String Either Int](Left("Boom"), Right(42)).flatten)
^
编译器输出的 GenTraversableOnce[B]
中的 B
是什么?
最佳答案
因为没有从Either
到Right
或Left
的隐式转换,你不能使用flatMap
(flatten
) 在 Either
的 List
上。详情 here .
如果想法是摆脱 Left
元素并获取 Right
元素中包含的内容,那么对于此输入:
val list = List[Either[String, Int]](Left("Boom"), Right(42))
你可以调用:
list.flatMap(_.right.toOption)
或:
list.collect{ case Right(x) => x }
两者都产生:
res0: List[Int] = List(42)
链接到 Either , RightProjection和 collect
关于scala - 为什么不能将 Eithers 列表展平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49829826/