Вывод типа Scala на экзистенциальный тип
Рассмотрим следующий фрагмент кода, который является уменьшенной версией моей первоначальной проблемы:
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 1.0
}
Это терпит неудачу с ошибкой времени компиляции, котораяvariable
был сделан вывод, чтобы иметь типRandomVariable[_0]
когдаAssignment
требуемый тип.Any
Почему value
также не подразумевается, чтобы иметь тип ?_0
Я попытался дать экзистенциальному типу имя, чтобы дать подсказку компилятору с помощьюcase (variable: RandomVariable[T forSome {type T}]) :: tail =>
но это также не будет компилировать (говоря, что не может найти тип T, который ябуду заинтересован в объяснении также).
Для дальнейшей мотивации рассмотрим, когда мы фиксируем параметр типа следующим образом:
case variable :: tail =>
def sum[A](variable: RandomVariable[A]): Double = {
val enumerated = for {value