scala - 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)]
,
d
和n
:Int
一旦我告诉 IntelliJ 将我的代码发送到 Scala 控制台,就会出现编译器错误。
解决方案
当你yield
在A
a 上迭代时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 的复杂性特征的更多信息,请参见此处。
推荐阅读
- xcode - 是否可以在 iTunes for app 中更改下一版本的设备类型?
- javascript - 无法在 ClientApp 子文件夹中的 angular 8.0 应用程序的 asp.net 核心项目中的任何断点处停止
- javascript - 在 rollup.js 环境变量中使用冒号
- excel - 根据与列的偏移量设置选项卡颜色
- java - 拆分返回 PatternSyntaxException:非法/不支持的转义序列
- react-native - 如何在电影监视列表中正确使用 AsyncStorage
- android - 如何在opencv for android中设置opencl
- dynamics-365 - D365 (DevVM):BestPractise 在更新到 PU28 后中断
- python-3.x - 如何命名 netcdf 文件中的列?
- node.js - 如何创建图像数组并将其存储在mongodb中