Scala语言规范将Existential Types的语法指定为

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


我已经看到很多代码一起使用forSometype,例如

List[T] forSome { type T; }


但是我从未见过forSomeval,有样品吗?

最佳答案

如果您考虑一下,您很快就会意识到,类型中出现的唯一时间值是与路径相关的类型。例如:

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几乎没有用。通常,这样的存在类型仅作为更大类型的一部分才真正有用。

关于scala - forSome {val`?的样本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22741372/

10-09 01:53