0

我正在解决99 个 Scala 问题,并且在#27 - Group Elements of a Set into Disjoint Subsets上遇到了障碍。我已经编写了一个可以完成所有工作的辅助函数,唯一的问题是我得到了type mismatch error。这是功能:

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))
}

listis 类型和List[T]函数combinations返回 a List[List[T]]。编译器正在计算将其键入为List[List[List[Any]]],因此与签名不匹配。

我不太关心风格/惯用语建议,而是更好地掌握如何正确推理类型评估。除了回答如何正确地编写它以匹配正确的签名之外,指示当前形式的此函数如何返回除 a 以外的任何List[List[List[T]]]内容的内容也会有所帮助。


编辑:

的完整签名combinations

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

1 回答 1

3

a究竟是怎样listList[T]

T是方法的通用参数addGroup。如果list在方法之外定义,那么它不能是List[T]与相同的T

假设你有

class YourCode[T]  {

   val list: List[T]

   def addGroup[T](....)

}

T参数 inaddGroup只是隐藏了in TYourCode它们是两种不同的类型。您可以重命名它,例如U,无需更改任何内容,除非明确说明。这样做, in list diff xss.flattenlistis 类型List[T]xss.flattenis List[U]TU是两个不同的类型参数,可以是任何东西(没有界限),最好的常见超类型 is Any,所以diffis aList[Any]而不是 expected List[T]。从那里,你到达List[List[List[Any]]] 终点。

于 2013-06-05T07:27:55.887 回答