IntelliJ抱怨“类型List [Any]的表达式不符合 first :: pack(rest)行上的预期类型List [T]”。
val data = List("a", "a", "a", "b", "c", "c", "a")
def pack[T](xs: List[T]): List[T] = xs match {
case Nil => Nil
case x :: xs1 =>
val (first, rest) = xs span (y => y == x)
first :: pack(rest)
}
pack(data)
当模式匹配发现原始列表不是Nil时,它将至少有一个成员。那是x :: xs1。当跨度应用于原始列表时,条件为y => y == x,它应该返回一个List。在这个例子中,对于第一个找到的字符'a',它应该返回List(a,a,a),然后匹配第一个。 我无法弄清楚为什么Scala抱怨。
目标是有一个清单
List(List(a, a, a), List(b), List(c, c), List(a))
P.S。 我的返回类型错误,应该是List [List [T]]。谢谢你的帮助。
答案 0 :(得分:1)
现在您已经澄清了要求。您希望将#pragma omp parallel for
for(int i = 0; i < 10000000; i++)
A[i] = B[i] + C[i];
作为输入List(List(a, a, a), List(b), List(c, c), List(a))
的输出。
问题是List("a", "a", "a", "b", "c", "c", "a")
本身属于Nil
类型,因此scala.collection.immutable.Nil.type
函数的整体返回类型被解释为pack
。
因此,请List[Any]
替换case Nil => Nil
,List[T]()
替换first :: pack(rest)
。
此外,x :: pack(rest)
无法比较对象,请将其替换为y => y == x
。
y => y.equals(x)
答案 1 :(得分:0)
val data = List("a", "a", "a", "b", "c", "c", "a")
def pack[T](xs: List[T]): List[List[T]] = {
def helper(map: Map[T, Int])(xs: List[T]): Map[T, Int] = xs match {
case Nil => map
case x :: xs =>
if (map contains x) {
helper(map + (x -> (map(x) + 1)))(xs)
} else {
helper(map + (x -> 1))(xs)
}
}
helper(Map.empty[T, Int])(xs).map { case (x, count) => List.fill(count)(x) }.toList
}
println(pack(data))
scala> println(pack(data))
List(List(a, a, a, a), List(b), List(c, c))