我在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中找不到它。在哪里定义?
答案 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的前半部分使用此技术构建流类型。