Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 卡在类型不匹配上_Scala_Types_Compiler Errors - Fatal编程技术网

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
a
list[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
a
List[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]
,没有真正考虑它。谢谢,这对我来说真的很清楚。