在scala 2.7.6中编译这段代码:
def flatten1(l: List[Any]): List[Any] = l.flatten
字符串我得到错误:
no implicit argument matching parameter type (Any) = > Iterable[Any] was found
型为什麽?
xggvc2p61#
如果你希望能够将List(1, 2, List(3,4), 5)“扁平化”为List(1, 2, 3, 4, 5),那么你需要这样的东西:
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中的新聚合函数:
flatten
List[Int]
List
Int
val list = List(1, 2, 3) println( list.sum ) //6
vshtjzan2#
文件:连接此列表的元素。此列表的元素应该是可迭代的。注意:编译器可能无法推断类型参数。仔细注意第二句话。Any不能转换为Iterable[Any]。你可以有一个Int s的列表,这个列表不能被展平,因为Int是不可迭代的。想想看,如果你有List[Int],你在展平什么?你需要List[B <: Iterable[Any]],因为这样你就有两个维度,可以被展平为一个。
Any
Iterable[Any]
List[B <: Iterable[Any]]
w8ntj3qf3#
flatten在Scala 3中不接受任何参数。
3条答案
按热度按时间xggvc2p61#
如果你希望能够将
List(1, 2, List(3,4), 5)
“扁平化”为List(1, 2, 3, 4, 5)
,那么你需要这样的东西:字符串
沿着:
型
编辑:* 以下是我最初的回答,直到OP在评论米奇的回答时澄清了他的问题 *
当你
flatten
aList[Int]
时,你 * 期望发生什么 *?你期望函数在List
中对Int
s求和吗?如果是这样,你应该看看2.8.x中的新聚合函数:型
vshtjzan2#
文件:
连接此列表的元素。此列表的元素应该是可迭代的。注意:编译器可能无法推断类型参数。
仔细注意第二句话。
Any
不能转换为Iterable[Any]
。你可以有一个Int
s的列表,这个列表不能被展平,因为Int
是不可迭代的。想想看,如果你有List[Int]
,你在展平什么?你需要List[B <: Iterable[Any]]
,因为这样你就有两个维度,可以被展平为一个。w8ntj3qf3#
flatten在Scala 3中不接受任何参数。