坚持类型不匹配

时间:2013-06-05 04:01:48

标签: 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]]]的函数。 / p>

<小时/>

编辑:

combinations的完整签名是

def combinations[T](n: Int, list: List[T]): List[List[T]]

1 个答案:

答案 0 :(得分:3)

list List[T]到底是怎样的?

T是方法addGroup的通用参数。如果在方法之外定义了list,则它不能是具有相同List[T]的{​​{1}}。

假设你有

T

class YourCode[T] { val list: List[T] def addGroup[T](....) } 中的T参数只隐藏addGroup中的T,它们是两种不同的类型。您可以重命名它,例如YourCode而不更改任何内容,除非明确说明。这样做,在Ulist diff xss.flatten类型为listList[T]xss.flattenList[U]T两种不同类型参数可以是任何(无边界)最佳常见超类型是U,因此Anydiff而不是预期的List[Any]。从那里开始,你得到List[T]