Что делает Predef.identity в scala?

Здесь есть документация о Predef, но нет слова об идентификаторе. Для чего предназначена эта функция? И что он делает?

Ответ 1

Это просто экземпляр функции идентификации, предопределенный для удобства, и, возможно, для того, чтобы люди не переопределяли его самостоятельно целую кучу раз. identity просто возвращает свой аргумент. Иногда бывает полезно перейти к функциям более высокого порядка. Вы можете сделать что-то вроде:

scala> def squareIf(test: Boolean) = List(1, 2, 3, 4, 5).map(if (test) x => x * x else identity) 
squareIf: (test: Boolean)List[Int]

scala> squareIf(true)
res4: List[Int] = List(1, 4, 9, 16, 25)

scala> squareIf(false)
res5: List[Int] = List(1, 2, 3, 4, 5)

Я также видел, что время от времени оно использовалось как значение аргумента по умолчанию. Очевидно, вы могли бы просто сказать x => x любое место, где вы могли бы использовать identity, и вы даже сохранили бы пару символов, поэтому он не купит вас много, но он может быть самодокументирован.

Ответ 2

Кроме того, что уже упоминалось acjay, функция Identity чрезвычайно полезна в сочетании с неявными параметрами.

Предположим, что у вас есть такая функция:

implicit def foo[B](b: B)(implicit converter: B => A) = ...

В этом случае функция Identity будет использоваться как неявный преобразователь, когда какой-либо экземпляр B <: A передается как первый аргумент функции.

Если вы не знакомы с неявными преобразованиями и как использовать неявные параметры для их цепочки, прочитайте следующее: http://docs.scala-lang.org/tutorials/FAQ/chaining-implicits.html