scala - 卡在类型不匹配

我正在研究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]]]

https://stackoverflow.com/questions/16931340/

相关文章:

c# - 错误: An object reference is required for the n

c# - 扩展方法找不到类型的定义

vb.net - 未定义类型 'CrystalDecisions.CrystalReports.En

module - verilog 看不到我的功能

c++ - 获取CUDA错误 “declaration is incompatible with p

class - 在 VBA 中设置类时编译错误

web-services - 我收到错误 “Server Application Unavailab

compiler-errors - 访问冲突写入位置…可能是由mpi_get_processor_n

inheritance - TypeScript 模块引用

debugging - SASS不一致的缩进错误