对价值的存在量化

时间:2010-02-03 10:14:22

标签: scala types

我在Scala语言中遇到了关于值的存在量化 规范(3.2.10存在类型)。

x: y.Inner forSome{val y : Outer}

有人有说明性的用例吗?

T forSome {val x: S}定义为T forSome { type t <: S with Singleton }。 Singletron特性在规范(3.2.1单例类型)中提到,但我在Scaladoc中找不到它。在哪里定义?

2 个答案:

答案 0 :(得分:12)

与类型名称中提到的内部类一样有用。例如,参见A Tour of Scala: Inner Classes中定义的图和节点类。对值的存在量化用于写入某些未指定图的节点类型。

type SomeNode = g.Node forSome { val g: Graph }

如果您希望有一个方法将两个节点作为必须来自同一图形的参数,这可能很有用。

def somethingWithTwoNodes[N <: g.Node forSome { val g: Graph }](n1: N, n2: N) = (n1,n2)

请注意,2.7不会接受该方法定义,因为它认为N中存在某种递归。

然后,如果你有

val g1 = new Graph
val g2 = new Graph

然后这些编译

somethingWithTwoNodes(g1.newNode, g1.newNode)
somethingWithTwoNodes(g2.newNode, g2.newNode)

但这些不是

somethingWithTwoNodes(g1.newNode, g2.newNode)
somethingWithTwoNodes(g2.newNode, g1.newNode)

至于Singleton特性,它并没有以典型方式真正定义,即没有类文件。它类似于Any,AnyVal,AnyRef和Null类型。它在src/compiler/scala/tools/nsc/symtab/Definitions.scala中与其他类型一起定义,但我怀疑这是非常有用的信息。它也是一个奇怪的野兽是最后的特征,这意味着你在定义一个特征或类时不能混合它,它实际上更像是一个标记,编译器认为它是一个类型,说它是任何其他类型的唯一。< / p>

答案 1 :(得分:0)

this paper的前半部分使用此技术构建流类型。