List [Any]类型的表达式不符合预期类型List [T]

时间:2016-09-04 01:35:35

标签: scala

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]]。谢谢你的帮助。

2 个答案:

答案 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 => NilList[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))
相关问题