写作时
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]
是什么?
答案 0 :(得分:1)
由于没有从Either
到Right
或Left
的隐式转换,因此您无法在flatMap
(flatten
)上使用{ {1}}的{1}}。详情here。
如果想要摆脱List
元素并获取Either
个中包含的内容,那么对于此输入:
Left
你可以致电:
Right
或:
val list = List[Either[String, Int]](Left("Boom"), Right(42))
两者都产生:
list.flatMap(_.right.toOption)
的链接
答案 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 方法
的任何内容