scala:list.flatten:没有找到与参数类型(Any)=> Iterable[Any]匹配的隐式参数

问题描述 投票:0回答:3

在 scala 2.7.6 中编译此代码:

def flatten1(l: List[Any]): List[Any] = l.flatten

我收到错误:

no implicit argument matching parameter type (Any) = > Iterable[Any] was found

为什么?

scala compilation
3个回答
8
投票

如果您希望能够将

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

4
投票

文档:

连接此列表的元素。该列表的元素应该是 Iterables。注意:编译器可能无法推断类型参数。

请密切注意第二句话。

Any
无法转换为
Iterable[Any]
。您可以有一个
Int
列表,并且该列表无法展平,因为
Int
不可迭代。想一想,如果你有
List[Int]
,你在压平什么?您需要
List[B <: Iterable[Any]]
,因为这样您将拥有两个维度,可以将其展平为一维。


0
投票

flatten 在 Scala 3 中不接受任何参数。

© www.soinside.com 2019 - 2024. All rights reserved.