在 scala 2.7.6 中编译此代码:
def flatten1(l: List[Any]): List[Any] = l.flatten
我收到错误:
no implicit argument matching parameter type (Any) = > Iterable[Any] was found
为什么?
如果您希望能够将
List(1, 2, List(3,4), 5)
“压平”为 List(1, 2, 3, 4, 5)
,那么您需要类似:
implicit def any2iterable[A](a: A) : Iterable[A] = Some(a)
连同:
val list: List[Iterable[Int]] = List(1, 2, List(3,4), 5) // providing type of list
// causes implicit
// conversion to be invoked
println(list.flatten( itr => itr )) // List(1, 2, 3, 4, 5)
编辑:以下内容是我原来的答案,直到OP在对米奇答案的评论中澄清了他的问题
当您flatten
a
List[Int]
时,您期望发生什么?您是否期望该函数对
Int
中的 List
求和?如果是这样,您应该查看 2.8.x 中的新聚合函数:
val list = List(1, 2, 3)
println( list.sum ) //6
文档:
连接此列表的元素。该列表的元素应该是 Iterables。注意:编译器可能无法推断类型参数。
请密切注意第二句话。
Any
无法转换为 Iterable[Any]
。您可以有一个 Int
列表,并且该列表无法展平,因为 Int
不可迭代。想一想,如果你有List[Int]
,你在压平什么?您需要 List[B <: Iterable[Any]]
,因为这样您将拥有两个维度,可以将其展平为一维。
flatten 在 Scala 3 中不接受任何参数。