我在Scala语言规范(3.2.10存在类型)中遇到了关于值的存在量化.
x: y.Inner forSome{val y : Outer}
Run Code Online (Sandbox Code Playgroud)
有人有说明性的用例吗?
T forSome {val x: S}被定义为T forSome { type t <: S with Singleton }.Singletron特性在规范(3.2.1单例类型)中提到,但我在Scaladoc中找不到它.它在哪里定义?
Geo*_*edy 12
它与类型名称中提到的内部类一起使用很有用.例如,参见A Tour of Scala:Inner Classes中定义的Graph和Node 类.对值的存在量化用于写入某些未指定图的节点类型.
type SomeNode = g.Node forSome { val g: Graph }
Run Code Online (Sandbox Code Playgroud)
如果您希望有一个方法将两个节点作为必须来自同一图形的参数,这可能很有用.
def somethingWithTwoNodes[N <: g.Node forSome { val g: Graph }](n1: N, n2: N) = (n1,n2)
Run Code Online (Sandbox Code Playgroud)
请注意,2.7不接受该方法定义,因为它认为在N中存在某种递归.
然后,如果你有
val g1 = new Graph
val g2 = new Graph
Run Code Online (Sandbox Code Playgroud)
然后这些编译
somethingWithTwoNodes(g1.newNode, g1.newNode)
somethingWithTwoNodes(g2.newNode, g2.newNode)
Run Code Online (Sandbox Code Playgroud)
但这些没有
somethingWithTwoNodes(g1.newNode, g2.newNode)
somethingWithTwoNodes(g2.newNode, g1.newNode)
Run Code Online (Sandbox Code Playgroud)
至于Singleton特性,它并没有以典型方式真正定义,即没有类文件.它类似于Any,AnyVal,AnyRef和Null类型.它src/compiler/scala/tools/nsc/symtab/Definitions.scala与其他类型一起定义,但我怀疑这是非常有用的信息.它也是一个奇怪的野兽是最后的特征,这意味着你在定义一个特征或类时不能混合它,它实际上更像是一个标记,编译器认为它是一种类型,表明它是任何其他类型的唯一.