Например, List[T] forSome { type T }
эквивалентен List[_]
, но верно ли это для любого возможного использования forSome
или существуют случаи, когда forSome
не может быть заменен эквивалентом второго синтаксиса?
Могут ли все применения `forSome` заменяться эквивалентным использованием` _`?
Ответ 1
Нет, не все преобразования могут быть преобразованы таким образом. Что-то вроде этого (спасибо ретрону, ниже, кто должен получать вверх на этом)
def foo(xs: Map[T, T] forSome { type T})
Дело здесь в том, что я могу использовать экзистенцию в нескольких местах, но она такая же экзистенциальная. Очевидно, что если вы используете подстановочные знаки, вы будете ссылаться на различные экзистенции
Ответ 2
_
в этом контексте является "Синтаксис-заполнитель для экзистенциальных типов", описанный в 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 использует знак подчеркивания для экзистенций, а не тип функций уровня.
UPDATE
Позвольте мне представить @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 }