我在Scala语言规范(3.2.10存在类型)中遇到了对值的存在量化。
x: y.Inner forSome{val y : Outer}有人对它有说明性的用例吗?
T forSome {val x: S}被定义为T forSome { type t <: S with Singleton }。在规范(3.2.1 Singleton类型)中提到了Singletron特征,但我在Scaladoc中找不到它。它在哪里定义的?
发布于 2010-02-04 11:31:19
它与类型名称中提到的内部类一起很有用。例如,请参阅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中和其他类型一起定义的,但我怀疑这些信息是否有用。它也是一个奇怪的怪兽,它是一个最终的特征,这意味着当你定义一个特征或类时,你不能把它混入其中,它实际上更多地是编译器赋予一个类型的一个标记,以表明它与任何其他类型是唯一的。
发布于 2010-02-05 01:14:40
this paper的前半部分使用了这种技术来构建流类型。
https://stackoverflow.com/questions/2191142
复制相似问题