我在scala reference的文档中看到,第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
,是否有任何样本?
答案 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
是无用的。通常情况下,这种存在类型只会作为更大类型的一部分非常有用。