f
関数リテラルを示す値です。
ステートメントでは、右側は関数リテラルです。左側はそれをvalueと呼ばれる名前にバインドします(val
キーワードはlet
LISPの場合と同様です)。これで、関数はシンボルに関連付けられたf
ので、このシンボルを使用してその関数を参照できますf
。
f
私はそれが変数と呼ばれるべきであることを示唆する他の答えに同意しません。は値です。これは、1回だけ決定され、変更できないf
右側の項に固定されているためです。逆に、で導入された変数を使用すると、シンボルに値を再割り当てできます。var
var f = (i: Int) => i + 1
var
変数定義の始まりは、変数f
の名前または記号であり、変数のオプションの定義型が存在する可能性があり(これを省略した場合: ...
、型は割り当てから自動的に推測されます)、最初に割り当てられ= ...
た値を定義します。変数。
したがって、値と言うときは、これを数値定数と混同しないでください。これは、変更されない単なるエンティティです。関数も値にすることができますf
。これは、その関数に異なる引数を指定して異なる結果を生成できる場合でも、常に同じ同一の関数を示すためです。
これで、var
右側を再割り当てできます。
f(2) // --> 3
f = (i: Int) => i * 2 // assign a new function to the variable f.
f(2) // --> 4
関数型プログラミングとは、変数(再割り当て)を回避することです。
関数を(値または変数に)まったく割り当てずに定義することもできます。以下はそのような関数を定義し、引数を使用してすぐに呼び出します4
。
{ i: Int => i + 1 } apply 4 // --> 5
それ自体がステートメントとして役立つことはめったにありませんが、関数の引数を期待するメソッドを呼び出すと、「plain」関数が頻繁に表示されます。例えば
val s = List(1, 2, 3)
s.map { (i: Int) => i + 1 } // --> List(2, 3, 4)
s.map { _ + 1 } // equivalent
s.map( _ + 1 ) // equivalent