_
в этом контексте - «Синтаксис заполнителя для экзистенциальных типов», описанный в 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 }