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

时间:2009-10-21 04:19:44

标签: scala compilation

在scala 2.7.6中编译此代码:

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

我收到错误:

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

为什么?

2 个答案:

答案 0 :(得分:6)

如果您希望能够将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在对Mitch的回答的评论中澄清了他的问题

flatten List[Int]时,您期待发生什么?您是否期望该函数对Int中的List求和?如果是这样,您应该在 2.8.x 中查看新的aggegation函数:

val list = List(1, 2, 3)
println( list.sum ) //6

答案 1 :(得分:4)

文档:

  

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

密切注意第二句话。 Any无法转换为Iterable[Any]。您可以拥有Int的列表,并且由于Int不可迭代,因此该列表无法展平。考虑一下,如果你有List[Int],你还有什么变平?您需要List[B <: Iterable[Any]],因为那时您将拥有两个维度,可以展平为一个维度。