Экзистенциальная квантификация по значениям

Я столкнулся с экзистенциальной квантификацией по значениям в Спецификации языка 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 Типа Singleton), но я не мог найти его в Scaladoc. Где это определяется?

9
задан Thomas Jung 3 February 2010 в 10:14
поделиться

2 ответа

Это полезно вместе с внутренними классами, как указано в именах типов. См., Например, классы Graph и Node, определенные в Обзор Scala: внутренние классы . Количественная оценка существования по значению используется для записи типа узлов некоторого неопределенного графа.

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)

Что касается Особенность синглтона, на самом деле она не определена стандартным образом, т.е. для нее нет файла класса. Это похоже на типы Any, AnyVal, AnyRef и Null. Он определен в src / compiler / scala / tools / nsc / symtab / Definitions.scala вместе с этими другими типами, но я сомневаюсь, что это очень полезная информация. Это также странный зверь, являющийся последней чертой, что означает, что вы не можете смешивать ее при определении черты или класса, это скорее маркер, который компилятор приписывает типу, чтобы сказать, что он уникален от любого другого типа.

12
ответ дан 4 December 2019 в 19:33
поделиться

В первой половине этой статьи этот метод используется для построения типа потока.

0
ответ дан 4 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: