Объявите универсальный класс в Scala без квадратных скобок

Читая эту статью, я пришел к следующему синтаксису:

implicit val slaveCanRead: Slave HasPrivilege Read = null

Автор говорит:

Кроме того, пожалуйста, не то Slave HasPrivilege Read это просто еще одна запись для HasPrivilege[Slave, Read]

Сохраняя пример в базовом scala, пример также может быть

val foo: Map[String, Long] = Map()
val bar: String Map Long = Map()

Я искал некоторую документацию / статьи, которые объяснили бы этот синтаксис, но не смог найти ни одного. Может кто-то указать на языковую функцию, которая позволяет этот синтаксис?

2 ответа

Решение

Это действительно так же просто, как T1 TCon T2 = TCon[T1, T2], Это раздел 3.2.8 спецификации языка.

InfixType ::= CompoundType {id [nl] CompoundType}

Если тип инфикса заканчивается : он является ассоциативным справа, в противном случае он остается ассоциативным, точно так же, как методы, а исправление смешивания является ошибкой без скобок.

Это инфиксный тип. таким образом

val map: Map[String, Int] = ...

на самом деле эквивалентно

val map: String Map Int = ...

Это особенно полезно для Function типа, чтобы вы могли написать

val f: Int => Int = ...

вместо

val f: Function[Int, Int] = ...
Другие вопросы по тегам