考虑以下代码片段,它是我原来问题的简化版本:
case class RandomVariable[A](values: List[A])
case class Assignment[A](variable: RandomVariable[A], value: A)
def enumerateAll(vars: List[RandomVariable[_]], evidence: List[Assignment[_]]): Double =
vars match {
case variable :: tail =>
val enumerated = for {value <- variable.values
extendedEvidence = evidence :+ Assignment(variable, value)
} yield enumerateAll(tail, extendedEvidence)
enumerated.sum
case Nil => 1.0
}
这会失败并出现编译时错误,该错误在required type时variable
被推断为具有type 。为什么也不推断有类型?我尝试为存在类型命名,以便通过使用向编译器提供提示,但这也不会编译(说它找不到类型 T,我也有兴趣对此进行解释)。RandomVariable[_0]
Assignment
Any
value
_0
case (variable: RandomVariable[T forSome {type T}]) :: tail =>
为了进一步推动,请考虑何时捕获类型参数,如下所示:
case variable :: tail =>
def sum[A](variable: RandomVariable[A]): Double = {
val enumerated = for {value <- variable.values
extendedEvidence = evidence :+ Assignment(variable, value)
} yield enumerateAll(tail, extendedEvidence)
enumerated.sum
}
sum(variable)
这编译没有警告/错误。我可以在第一个示例中修改某些内容以不需要此额外功能吗?
编辑:更明确地说,我想知道为什么value
不被推断为类型_0
,即使variable
是类型_0
并且每个值都来自List[_0]
in variable
。另外我想知道是否有任何其他方法可以告诉编译器这个事实(除了捕获我上面给出的函数中的类型)。