`forSome {val`的样本?

时间:2014-03-30 07:22:05

标签: scala

我在scala reference的文档中看到,第26页:

3.2.10 Existential Types

    Syntax:

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

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

List[T] forSome { type T; }

但我从未见过forSome val,是否有任何样本?

1 个答案:

答案 0 :(得分:16)

如果您考虑一下,您很快就会意识到值在类型中出现的唯一时间是机智路径依赖类型。例如:

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是无用的。通常情况下,这种存在类型只会作为更大类型的一部分非常有用。