Почему синтаксис параметра Scala By-Name не выполняется при удалении пробела между: и =>

У меня просто вопрос в отношении синтаксиса именованных параметров Scala. Я создал приведенный ниже фрагмент кода, и он работает нормально. Тем не менее, когда я удалил пространство между a: =>Int в a:=>Int, это не удается.

Это работает без каких-либо проблем:

object Calculator extends App {
  def sum(a: => Int) = (b: Int) => a + b
  println(sum(4)(5))
}

Следующий сбой с синтаксической ошибкой, когда я удаляю пробел в строке 2 в sum(a:=>Int):

object Calculator extends App {
  def sum(a:=> Int) = (b: Int) => a + b
  println(sum(4)(5))
}

Почему второй фрагмент кода не компилируется?

1 ответ

Решение

Это терпит неудачу на самом первом этапе, во время лексического анализа, потому что :=> действительный идентификатор Scala:

val :=> = 42
println(:=>)  // prints 42

Поэтому твой код

def sum(a:=> Int) = ??? // wrong: unexpected identifier `:=>`

так же недействительно, как, скажем,

def sum(a+= Int) = ??? // wrong: unexpected identifier `+=`

или же

def sum(a:: Int) = ??? // wrong: unexpected identifier `::`
Другие вопросы по тегам