scala - 卡在类型不匹配

标签 scala types compiler-errors

我正在研究99 Scala Problems并遇到了对#27 - Group Elements of a Set into Disjoint Subsets的困扰。我已经编写了一个可以完成所有工作的辅助函数,唯一的问题是我遇到了类型不匹配错误。功能如下:

def addGroupN[T](gs: List[List[List[T]]], n: Int): List[List[List[T]]] = {
  gs.flatMap(xss => combinations(n, list diff xss.flatten).map(xs => xss :+ xs))
}
list的类型为List[T],而函数combinations返回List[List[T]]。编译器正在计算它的类型为List[List[List[Any]]],因此与签名不匹配。

我不太关心样式/惯用语的建议,而比我更好地掌握如何正确地推理类型评估的关注程度小。除了回答如何正确地编写它以匹配正确的签名之外,一些指示该函数以其当前形式可以返回除List[List[List[T]]]之外的任何内容的方法也将有所帮助。

编辑:
combinations的完整签名是
def combinations[T](n: Int, list: List[T]): List[List[T]]

最佳答案

listList[T]到底是什么?
TaddGroup方法的通用参数。如果list在方法之外定义,则它不能是具有相同List[T]T

假设你有

class YourCode[T]  {

   val list: List[T]

   def addGroup[T](....)

}
T中的addGroup参数只是隐藏T中的YourCode,它们是两种不同的类型。您可以将其重命名为U,而无需更改任何内容,除非明确说明。这样做,在list diff xss.flatten中,listList[T]类型,xss.flattenList[U]TU是两个不同的类型参数,可以是任何类型(无界),最好的通用父类(super class)型是Any,因此diffList[Any]而不是预期的List[T]。从那里,您最后得到List[List[List[Any]]]

关于scala - 卡在类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16931340/

相关文章:

xml - 如何防止 Scala 的 XML PrettyPrinter 类删除换行符

Scala 抽象类型成员 - 继承和类型边界

scala - 在 Scaladoc 中用类型别名替换完整类型

c - 默认情况下,char 是有符号的还是无符号的?

c++ - 使用 C++ 绑定(bind)编译 OpenCL

代码崩溃编译器 : main() returning a struct instead of an int

scala - Spark2 - LogisticRegression 训练完成,但结果未收敛,因为 : line search failed

java - 从 java 中特定类型的 ArrayList<T> 获取对象

sql-server - 哪些 Progress 数据类型对应于哪些 SQL Server 数据类型?

compiler-errors - Msys2 -> f951.exe : Fatal Error: Reading module '...' at line 2 column 1: Unexpected EOF