Scalaの関数

関数リテラル

参考サイト
Scalaリテラルメモ(Hishidama's Scala literal Memo)

関数リテラルを使って以下のように関数を定義できます。関数名がありませんから無名関数ともいいます。

scala> (x: Int, y: Int) => x + y
res0: (Int, Int) => Int = $$Lambda$2852/355456123@6fc9bf98

scala> res0(1,2)
res1: Int = 3

変数に代入できます。

scala> val add = (x: Int, y: Int) => x + y
add: (Int, Int) => Int = $$Lambda$2858/650481845@6835b247

scala> add(4,6)
res2: Int = 10

上記の例で関数の型は(Int, Int) => Intと表現されていることが分かります。これは引数がInt型の2つで、Int型を返すことを表します。
また変数リテラルのような定義の仕方をラムダ式といいます。

defと関数リテラルの違い

第一級関数とは関数を変数に代入したり、引数としたり、戻り値としたりできることです。

defはメソッドを定義します。メソッドは第一級関数ではありません。def以外で定義した関数は第一級関数です(厳密にはdefで定義したメソッドを関数とは呼びません)。
メソッドが入った変数、メソッドを引数にする関数、メソッドを返す関数は存在しません。

メソッドの後ろに_をつけて、関数に変換することができます。

scala> def add(x: Int, y:Int) = x + y
add: (x: Int, y: Int)Int

scala> val f = add
<console>:12: error: missing argument list for method add
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `add _` or `add(_,_)` instead of `add`.

scala> val f = add _
f: (Int, Int) => Int = $$Lambda$2954/343966510@26a84255