Я новичок в Scala, и мне это очень нравится, но иногда это меня удивляет. Например:
clickedCallbacks: List[() => Unit])
Может ли кто-нибудь сказать мне, что означают => и () => в Scala?
Я новичок в Scala, и мне это очень нравится, но иногда это меня удивляет. Например:
clickedCallbacks: List[() => Unit])
Может ли кто-нибудь сказать мне, что означают => и () => в Scala?
 => - синтаксический сахар для создания экземпляров функций. Напомним, что каждая функция из scala является экземпляром класса.
Например, тип Int => String, эквивалентен типу Function1[Int,String], то есть функции, которая принимает аргумент типа Int и возвращает a String.
  scala> val f: Function1[Int,String] = myInt => "my int: "+myInt.toString
  f: (Int) => String = <function1>
  scala> f(0)
  res0: String = my int: 0
  scala> val f2: Int => String = myInt => "my int v2: "+myInt.toString
  f2: (Int) => String = <function1>
  scala> f2(1)
  res1: String = my int v2: 1
Здесь myInt привязывается к значению аргумента, переданному в f и f2.
 () => T - это тип функции, которая не принимает аргументов и возвращает a T. Это эквивалентно Function0[T]. () называется списком нулевых параметров, который я считаю.
 scala> val f: () => Unit = () => { println("x")}
 f: () => Unit = <function0>
 scala> f()
 x
scala> val f2: Function0[Unit] = () => println("x2")
f: () => Unit = <function0>
scala> f2()
x2
 => имеет несколько значений в Scala, все они связаны с его математическим значением как импликацией.
В значении он вводит литерал функции или лямбда. например бит внутри фигурных скобок в List(1,2,3).map { (x: Int) => x * 2 }
В типе с символами с обеих сторон стрелки (например, A => T, (A,B) => T, (A,B,C) => T и т.д.) он сахара для Function<n>[A[,B,...],T], то есть функции, которая принимает параметры типа A[,B...] и возвращает значение типа T.
Пустые парнеры в левой части (например, () => T) указывают, что функция не принимает никаких параметров (также иногда называемых "thunk" );
Пустые парнеры в правой части означают, что он возвращает () — единственное значение типа Unit, чье имя также можно записать () —:)
Функция, возвращающая Unit, также известна как процедура, обычно метод, вызывающий только его побочный эффект.
В объявлении типа для параметра метода или функции, без символа в левой части (например, def f(param: => T)), это параметр "по имени", что означает, что он оценивается каждый раз, когда он используется в тело функции, а не раньше. Обычные параметры "по значению" оцениваются перед входом в функцию/метод.
В предложении case они отделяют шаблон (и дополнительную защиту) от выражения результата, например. case x => y.
 () => Unit означает: "Функция типа, которая не принимает никаких параметров и не возвращает ничего" 
Итак, если вы объявляете значение f функцией, которая не принимает никаких параметров и не возвращает ничего, ее тип был бы следующим:
val f : () => Unit
Так как это val, вам нужно назначить значение, например функцию, которая печатает Hola mundo
val f : () => Unit  = () => println("Hola Mundo")
Это гласит: * "f - это функция, которая не принимает никаких параметров и не возвращает ничего инициализированного кодом println("Hola Mundo")
Так как в Scala вы можете использовать вывод типа, который вам не нужно объявлять, чтобы следующее было эквивалентно:
val f = () => println("Hola Mundo")
Чтобы вызвать его, вы можете просто:
f()
>"Hola mundo"
Или, поскольку функции также являются объектами, вы можете вызвать метод apply:
f.apply()
> "Hola Mundo"
Вот почему в вашей декларации вы говорите: "У меня будет список, который будет содержать функции без параметров и типов возврата", следовательно List [() = > Unit]
Надеюсь, это поможет.
 => - это "стрелка функции". Он используется как в сигнатурах типа функции, так и в терминах анонимных функций. () => Unit является сокращением для Function0[Unit], который является типом функций, которые не принимают аргументов и не возвращают ничего полезного (например, void на других языках).
В качестве наиболее упрощенного ответа вы можете заменить все, что есть в левой части = > , словом "LEFT" и все, что находится справа, со словом "RIGHT".
Тогда значение " LEFT = > RIGHT" становится:
Возьмите LEFT, затем сделайте RIGHT.
Это означает, что если у вас есть "() = > ", что вы ничего не можете взять (то есть нет параметров), а затем делать все, что находится справа.
Это наиболее распространенное значение.