Можно ли заменить все использования `forSome` эквивалентным использованием` _`? - PullRequest
12 голосов
/ 25 февраля 2012

Например, List[T] forSome { type T } эквивалентно List[_], но верно ли это для каждого возможного использования forSome или есть случаи, когда forSome не может быть заменен эквивалентом второго синтаксиса?

Ответы [ 2 ]

15 голосов
/ 25 февраля 2012

Нет, не все употребления могут быть преобразованы таким образом. Примерно так (спасибо retronym , ниже, кто должен получать голоса по этому вопросу)

def foo(xs: Map[T, T] forSome { type T})

Суть в том, что я могу использовать экзистенциал в нескольких местах, но это тот же экзистенциальный . Очевидно, что если бы вы использовали подстановочные знаки, вы бы ссылались на разные экзистенции

14 голосов
/ 25 февраля 2012

_ в этом контексте - «Синтаксис заполнителя для экзистенциальных типов», описанный в 3.2.10 спецификации языка .

Имя звучит очень похоже на другое использование _, "Синтаксис заполнителя для анонимных функций".Это сокращение не может быть использовано для всех функций.Например:

(a: A) => f(g(a))
f(g(_: A)) // WRONG, this means f((a: A) => g(a))

Мы можем построить аналогичный пример для экзистенциалов, которые не могут быть представлены _:

F[G[A]] forSome { type A }
F[G[_]] // WRONG, this means F[G[A] forSome { type A }]

Примечание: экзистенциалы не аналог уровня типа функций уровня значения.Это было бы:

({type l[A] = F[G[A]])#l

На самом деле очень жаль, что Scala использует подчеркивание для экзистенциалов, а не функций уровня типа.* Позвольте мне ответить @ oxbow_lakes 'таким же образом:

(a: A) => h(a, a)
h(_, _) // WRONG, this means (a, b) => f(a, b)

H[A, A] forSome { type A }
H[_, _] // WRONG, this means H[A, B] forSome { type A; type B }
...