Подтвердить что ты не робот

Могут ли все применения `forSome` заменяться эквивалентным использованием` _`?

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

4b9b3361

Ответ 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 }