Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.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_Generics - Fatal编程技术网

Scala 编译器在调用站点推断类型参数(在计算公共超类型时)

Scala 编译器在调用站点推断类型参数(在计算公共超类型时),scala,generics,Scala,Generics,只有v2编译以下代码。我希望能够调用我的apply方法,如v1示例中所示。编译器似乎太快了,无法将Nothing赋值给我的R变量 (推断的类型参数[…A,Nothing]不符合方法apply的类型参数界限[T1,如前所述,我只是将签名简化为def apply[R](d:Int,succ:R,fail:R):R。如果原始签名具有合法的类型参数,则它具有合法的类型参数,但编译器可以更好地推断剩余的单个类型参数。因此,我认为我找到了解决问题的方法。我认为集合在添加两种不同类型时会执行类似的操作。因此,

只有
v2
编译以下代码。我希望能够调用我的apply方法,如
v1
示例中所示。编译器似乎太快了,无法将
Nothing
赋值给我的
R
变量


(推断的类型参数[…A,Nothing]不符合方法apply的类型参数界限[T1,如前所述,我只是将签名简化为
def apply[R](d:Int,succ:R,fail:R):R
。如果原始签名具有合法的类型参数,则它具有合法的类型参数,但编译器可以更好地推断剩余的单个类型参数。

因此,我认为我找到了解决问题的方法。我认为集合在添加两种不同类型时会执行类似的操作。因此,这是自动推断其结果的方法:

def apply[S, R >: S](d : Int)(succ : S, fail : R): R = if ( d < 0 ) succ else fail
def apply[S,R>:S](d:Int)(成功:S,失败:R):R=if(d<0)成功否则失败

奇怪的是,只有当成功和失败属于同一个参数列表时才起作用。我想知道为什么编译器没有简单的方法来推断
R
。但是我不确定为什么您需要任何类型参数,因为没有真正的约束。
R
可能总是
any
,这没有多大用处。因为以后我可以做
R
上的结构递归(因此
R
应该是一种求和类型)您是对的,我把事情弄得太复杂了,因为我并不真正需要T1和T2类型的参数。但是,删除它们也没有帮助(您的示例显示了这一点)由于编译器仍然无法自动计算生成的类型,因此该示例适用于原始签名(从3个参数列表中可以看到)。在仔细检查后,它实际上不起作用,但不幸的是,我忘记了删除它。因为修改后的签名结果类型应该是推断的。是的,我最初的问题实际上并不显著。困难仅仅在于我使用了多个参数列表。因此,理解类型推断如何与多个参数一起工作是我的兴趣所在惯性导航与制导bit@CristianMartin从字面上看,只有第一个参数列表应该用于类型参数推断。假设您的答案有效,它看起来实际上就像第一个使用任何类型参数的参数列表。(参数列表影响类型推断的一个重要原因是,后面的参数列表中的函数可以具有已知的输入类型。)不,这不太正确:
只有第一个参数列表应该用于类型参数推断
。在我的answe中,我使用了第二个列表进行推断,效果很好。虽然我非常感谢您努力挖掘一些规范,但我必须承认我对它了解甚少。我应该更经常地检查它们!
def apply[S, R >: S](d : Int)(succ : S, fail : R): R = if ( d < 0 ) succ else fail