Scala 卡在类型不匹配上
我正在努力工作,遇到了困难。我已经编写了一个帮助函数来完成所有的工作,唯一的问题是我得到了一个类型不匹配错误。下面是函数:Scala 卡在类型不匹配上,scala,types,compiler-errors,Scala,Types,Compiler Errors,我正在努力工作,遇到了困难。我已经编写了一个帮助函数来完成所有的工作,唯一的问题是我得到了一个类型不匹配错误。下面是函数: 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[T],函数组合返回一个li
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[T]
,函数组合
返回一个list[T]
。编译器正在计算将其键入为List[List[List[Any]]]
,因此与签名不匹配
我不太关心风格/惯用语的建议,而是更好地掌握如何正确推理类型评估。除了回答如何正确地将其写入以匹配正确的签名外,还可以使用一些东西来指示此函数在其当前形式下如何返回除List[List[T]]]
以外的任何内容
编辑:
组合的完整签名为
def combinations[T](n: Int, list: List[T]): List[List[T]]
list
alist[T]
的准确程度如何
T
是方法addGroup
的通用参数。如果list
是在方法之外定义的,则它不能是具有相同T
的list[T]
如果你有
class YourCode[T] {
val list: List[T]
def addGroup[T](....)
}
addGroup
中的T
参数仅隐藏YourCode
中的T
,它们是两种不同的类型。您可以重命名它,例如U
,而无需更改任何内容,只需明确说明。这样做,在list diff xss.flatte
中,list
是list[T]
类型,xss.flatte
是list[U]
,T
和U
是两个不同的类型参数,可以是任何类型(无边界)。最常见的超类型是Any
,因此diff
是列表[Any]
而不是预期的List[T]
。从那里,您可以在结尾处看到List[List[Any]]]
。List
aList[T]
T
是方法addGroup
的通用参数。如果list
是在方法之外定义的,则它不能是具有相同T
的list[T]
如果你有
class YourCode[T] {
val list: List[T]
def addGroup[T](....)
}
addGroup
中的T
参数只是隐藏了YourCode
中的T
,它们是两种不同的类型。您可以重命名它,例如U
而不做任何更改,只是要清楚。这样做,在列表差异xss.flatte
中,list
属于list[T]类型
,xss.flatte
是List[U]
,T
和U
是两个不同的类型参数,可以是任何类型(无边界)。最常见的超类型是Any
,因此diff
是一个List[Any]
而不是预期的List[T]/code>。从那里,您可以得到List[List>[列出[任何]]]
在结尾。请添加组合的签名
方法。请添加组合的签名
方法。+1是的,这正是我想要的关于编译器如何评估类型的解释。您是否可以在addGroupN[T]的范围内包括如何正确捕获列表
方法,使其成为列表[T]
?我发现显式地向方法中添加ls:List[T]
参数并手动传入List
可以实现正确的计算。我假设有更好的方法。这取决于您的上下文。如果您在方法之外有列表[T](这意味着您在上下文中有类型T,如我的小示例中所示),并且您的addGroup方法将其输入与列表[T]相结合,那么addGroup方法就不是泛型的。它只接受封闭类型T的值,而不接受addGroup[T]所暗示的任何类型的值。因此只需编写def addGroup(gs:list…[T],…)
而不是def addGroup[T](…)
哦!现在完全有道理了。是的,我实际上不需要这个内部函数是泛型的……我实际上只是添加了[T]
没有真正考虑它。谢谢,这对我来说真的澄清了很多。+1是的,这正是我想要的关于编译器如何计算类型的解释。您是否也可以在addGroupN[T]
方法的范围内包括如何正确地捕获list
,使它成为list[T]
?我发现显式地向方法中添加一个ls:List[T]
参数并手动传入List
可以实现正确的计算。我认为有更好的方法。这取决于您的上下文。如果您在方法之外有一个List[T](这意味着您在上下文中有类型T,如我的小示例所示)并且您的addGroup方法将其输入与列表[T]相结合,那么addGroup方法就不是泛型的。它只接受封闭类型T的值,而不接受addGroup[T]所暗示的任何类型的值。因此只需编写def addGroup(gs:list…[T],…)
,而不是def addGroup[T](…)
哦!现在完全有道理了。是的,我实际上不需要这个内部函数是泛型的……我实际上只是添加了[t]
,没有真正考虑它。谢谢,这对我来说真的很清楚。