2012年1月14日土曜日

Scalaの関数オブジェクト

Scalaの関数オブジェクトの定義方法はいくつかの方法があってややこしいので、まとめてみた。

まず、きちんと書いた場合。
宣言時に引数の型と戻り値を指定している。
 val f:(Int => Int) = (x:Int) => x + 1

括弧をとってもいいようだ。
 val f:Int => Int = (x:Int) => x + 1

でも、関数の本体定義部分の括弧を取っちゃダメ
 val f:Int => Int = x:Int => x + 1

宣言時に型を書かないくてもOK
 val f = (x:Int) => x + 1

関数定義の部分の引数を書かなくてもOK
 val f:(Int => Int) = x => x + 1

でも、次のような横着はできないらしい
 val f = x => x + 1

引数が2つある場合
 val f:(Int,Int) => Int = (x:Int, y:Int) => x + y + 1

引数が1つのときと同様に、以下のようにも書ける
 val f = (x:Int, y:Int) => x + y + 1
 val f:(Int,Int) => Int = (x, y) => x + y + 1
結局、こうやって書くこと多い気がするなぁ
 val f = (x:Int, y:Int) => x + y + 1