Ответ 1
Если вы подумаете об этом, вы скоро поймете, что единственные значения времени, отображаемые в типах, являются зависимыми от типа типов. Пример:
trait Trait {
val x: { type T }
val y: x.T // path dependent type: here comes our val
}
Применяя это к экзистенциальным типам, мы теперь можем легко собрать образец forSome { val
:
type SomeList = List[v.T] forSome { val v : { type T }; }
Вышеупомянутый тип обозначает любой список, элементы которого имеют тип, зависящий от пути v.T
.
Пример:
object X {
type T = String
val x: T = "hello"
}
val l1: SomeList = List(X.x) // compiles fine
val l2: SomeList = List(123) // does not compile
Конечно, SomeList
довольно бесполезен, как есть. Как часто такой экзистенциальный тип был бы действительно полезен как часть более крупного типа.