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

ef1yzkbh  于 8个月前  发布在  Scala
关注(0)|答案(3)|浏览(91)

在scala 2.7.6中编译这段代码:

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

字符串
我得到错误:

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


为什麽?

xggvc2p6

xggvc2p61#

如果你希望能够将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]时,你 * 期望发生什么 *?你期望函数在List中对Int s求和吗?如果是这样,你应该看看2.8.x中的新聚合函数:

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

vshtjzan

vshtjzan2#

文件:
连接此列表的元素。此列表的元素应该是可迭代的。注意:编译器可能无法推断类型参数。
仔细注意第二句话。Any不能转换为Iterable[Any]。你可以有一个Int s的列表,这个列表不能被展平,因为Int是不可迭代的。想想看,如果你有List[Int],你在展平什么?你需要List[B <: Iterable[Any]],因为这样你就有两个维度,可以被展平为一个。

w8ntj3qf

w8ntj3qf3#

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

相关问题