Scala подчеркивают минимальную функцию - PullRequest
23 голосов
/ 12 декабря 2010

Давайте создадим значение ради этого вопроса:

val a = 1 :: Nil

Теперь я могу продемонстрировать, что анонимные функции могут быть написаны в сокращенной форме, например:

a.map(_*2)

возможно ли написать сокращение этой функции?:

a.map((x) => x)

мое решение не работает:

a.map(_)

Ответы [ 3 ]

42 голосов
/ 13 декабря 2010

Для записи, a.map(_) не работает, потому что это означает x => a.map(x), а не a.map(x => x). Это происходит потому, что один _ вместо параметра обозначает частично примененную функцию . В случае 2*_ это означает анонимную функцию . Эти два использования настолько близки, что их часто путают.

24 голосов
/ 12 декабря 2010

Ваша первая стенограмма также может быть написана без указания

a map (2*)

Благодаря умножению, являющемуся коммутативным.

Что касается (x) => x, вам нужна функция identity. Это определено в Predef и является общим, так что вы можете быть уверены, что оно безопасно для типов.

17 голосов
/ 12 декабря 2010

Вы должны использовать функцию identity для этого варианта использования.

a.map(identity)

identity определяется в scala.Predef как:

implicit def identity[A](x: A): A = x 
...