Подтвердить что ты не робот

Образец `forSome {val`?

Я вижу в документе scala ссылка, стр. 26:

3.2.10 Existential Types

    Syntax:

        Type ::= InfixType ExistentialClauses
        ExistentialClauses ::= ‘forSome’ ‘{’ ExistentialDcl
                               {semi ExistentialDcl} ‘}’
        ExistentialDcl ::=   ‘type’ TypeDcl
                           | ‘val’ ValDcl

Я видел, как много кода используют forSome и type вместе, например.

List[T] forSome { type T; }

Но я никогда не видел forSome с val, есть ли какой-нибудь образец?

4b9b3361

Ответ 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 довольно бесполезен, как есть. Как часто такой экзистенциальный тип был бы действительно полезен как часть более крупного типа.