为什么不能将Eithers列表弄平?

时间:2018-04-14 09:15:00

标签: scala

写作时

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)
                                                           ^

编译器输出中B中的GenTraversableOnce[B]是什么?

2 个答案:

答案 0 :(得分:1)

由于没有从EitherRightLeft的隐式转换,因此您无法在flatMapflatten)上使用{ {1}}的{​​1}}。详情here

如果想要摆脱List元素并获取Either个中包含的内容,那么对于此输入:

Left
你可以致电:

Right

或:

val list = List[Either[String, Int]](Left("Boom"), Right(42))

两者都产生:

list.flatMap(_.right.toOption)

指向EitherRightProjectioncollect

的链接

答案 1 :(得分:0)

要展平列表,它必须包含可以分解的元素。例如

List(List(1,2,3), List(6,7,9)).flatten

将产生

List(1, 2, 3, 6, 7, 9) because the elements are the list themselves. This is not the case with Either because Left and Right are the collection of elements.
  

编译器输出中GenTraversableOnce [B]中的B是什么?

它表示可以遍历的任何数据结构。您可以考虑支持 foreach 方法

的任何内容