首页 > 解决方案 > Scala 理解中的类型不匹配

问题描述

我试图定义一个看起来像这样的递归 Scala 函数:

  def doSomething: (List[List[(Int, Int)]], List[(Int, Int)], Int, Int) => List[Int] =
  (als, rs, d, n) =>
    if (n == 0) {
      for (entry <- rs if (entry._1 == d)) yield entry._2
    } else {
      for (entry <- rs; adj <- als(entry._1)) yield doSomething(als, rs.::((adj._1, adj._2 + entry._2)), d, n - 1)
    }

现在,编译器告诉我:

| | | | | | <console>:17: error: type mismatch; found : List[List[Int]] required: List[Int] for (entry <- rs; adj <- als(entry._1)) yield doSomething(als, rs.::((adj._1, adj._2 + entry._2)), d, n - 1) ^

我无法弄清楚问题是什么。我确定我使用<-正确。另一方面,我是来自 Java 世界的 Scala 新手......

关于输入的类型:

als: List[List[(Int,Int)]],

rs: List[(Int,Int)],

dnInt

一旦我告诉 IntelliJ 将我的代码发送到 Scala 控制台,就会出现编译器错误。

标签: scala

解决方案


当你yieldAa 上迭代时List,你返回 a List[A]doSomething返回 a List[Int],因此通过让您返回 a List[List[Int]]。你可以这样展开:

def doSomethingElse(als: List[List[(Int, Int)]], rs: List[(Int, Int)], d: Int, n: Int): List[Int] =
  if (n == 0) {
    for ((k, v) <- rs if k == d) yield v
  } else {
    for {
      (k, v) <- rs
      (adjk, adjv) <- als(k)
      item <- doSomethingElse(als, (adjk, adjv + v) :: rs, d, n - 1)
    } yield item
  }

请注意,为了简洁起见,我还使用了方法表示法并解构了这些对并利用了名称以:可读性结尾的方法的右关联性,请随意使用您可能想要的任何约定(但我真的不明白为什么有一个返回常量函数的方法(也许您只想使用 aval来声明它)。

进一步说明,您在线性序列 ( ) 上使用随机访问als(k),您可能需要考虑索引序列(如 a Vector)。有关 Scala Collection API 的复杂性特征的更多信息,请参见此处


推荐阅读