我正在处理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]]
答案 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
而不更改任何内容,除非明确说明。这样做,在U
,list diff xss.flatten
类型为list
,List[T]
为xss.flatten
,List[U]
和T
两种不同类型参数可以是任何(无边界)最佳常见超类型是U
,因此Any
是diff
而不是预期的List[Any]
。从那里开始,你得到List[T]
。