2010-12-12 11 views
19

はのは、この質問のために価値を創造してみましょう、最小限の機能を強調する:Scalaは

a.map(_*2) 

:今

val a = 1 :: Nil 

、私は無名関数は次のように簡略形式で書くことができることを実証することができますこの関数の省略形を書くことは可能ですか?:

a.map((x) => x) 

私の解決策は動作しません:

a.map(_) 
+0

あまり意味がありませんか?それは単なるNOPです。 – delnan

+0

これは単なる例です。文脈で意味をなさなくすることができます – coubeatczech

+2

これはScalaの '_'砂糖の過剰使用(imho)が本当に人々が言語を拾うのを困難にするケースの良い例です。 – akauppi

答えて

20

あなたの最初の速記形態はまた、乗算は可換であることに

a map (2*) 

感謝をポイントフリー書き込むことができます。

(x) => xについては、identity機能が必要です。これはPredefで定義されており、一般的なので、型保証されていることを確認できます。

+3

私はあなたが可換性を意味すると思います。 – Debilski

+2

'x => x'は4文字で、' identity'は8文字です。これが私が決して「アイデンティティ」を使用しない理由です。 –

+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)ではないため、動作しません。これは、パラメータの代わりに1つの_が部分的に適用された関数のを表すために発生します。 2*_の場合、それは匿名関数の略です。これらの2つの用途は非常に密接なものであり、非常に一般的であり、それらによって混乱する。