2010-12-12 3 views
19

Давайте создадим значение для этого вопроса:Scala подчеркивают минимальная функция

val a = 1 :: Nil 

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

a.map(_*2) 

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

a.map((x) => x) 

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

a.map(_) 
+0

Не имеет смысла, не так ли? Это просто NOP. – delnan

+0

это всего лишь пример. это может иметь некоторый смысл в контексте – coubeatczech

+2

Это хороший пример случаев, когда чрезмерное использование (imho) «_» сахара в Scala действительно затрудняет людям выбор языка. – akauppi

ответ

20

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

a map (2*) 

Благодаря умножению быть коммутативной.

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

+3

Я думаю, вы имеете в виду коммутативные. – Debilski

+2

Жаль, что 'x => x' - четыре символа, а' identity' - восемь. Вот почему я никогда не использую 'identity'. –

+0

@debilski Это непросто, вы знаете! Не тогда, когда есть 18-месячный бой за доступ к клавиатуре! –

15

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

a.map(identity) 

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

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

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

Смежные вопросы