Ответ 1
Ключевое слово forSome
используется для определения экзистенциальных типов в Scala. На этой странице Scala glossary объясняется, что это такое. Я не мог найти место в документах Scala, объясняющих их подробно, поэтому здесь - это статья в блоге, которую я нашел в Google, объясняя, как они полезны.
Обновление: вы можете найти точное определение экзистенциальных типов в Scala спецификации, но оно довольно плотное.
Чтобы обобщить некоторые из сообщений, с которыми я связан, экзистенциальные типы полезны, когда вы хотите работать над чем-то, но не заботитесь о деталях типа в нем. Например, вы хотите работать с массивами, но неважно, какой тип массива:
def printFirst(x : Array[T] forSome {type T}) = println(x(0))
который вы также можете использовать с переменной типа в методе:
def printFirst[T](x : Array[T]) = println(x(0))
но вы можете не захотеть добавить переменную типа в некоторых случаях. Вы также можете добавить привязку к переменной типа:
def addToFirst(x : Array[T] forSome {type T <: Integer}) = x(0) + 1
Также см. этот пост в блоге, в котором я получил этот пример.