なんとまあ関数の中に関数を入れられる。

scala> def foo(x:Int) = {  
| def bar(y:Int) = {
| y * 5
| }
| bar(x) + 1
| }
foo: (Int)Int

scala> foo(4)
res57: Int = 21


もちろん無名関数もいける。

scala> def foo() = {       
| (x:Int) => x + 8
| }
foo: ()(Int) => Int

scala> foo()
res58: (Int) => Int = <function>


foo()を実行すると、なんか関数っぽいのが返ってきてる。
返り値を受け取って実行してみよう。

scala> val hoge = foo()
hoge: (Int) => Int = <function>

scala> hoge(2)
res59: Int = 10


つーことで、関数は関数を返すこともできる。なんぞそれ。
こういうのを、高階関数っていうらしい。
なんかカッコいい響きだ。
高階関数は関数を返すだけじゃなくて、引数にとることもできる。

scala> def test(x:Int, f:(Int) => Int) = {  
| f(x)
| }
test: (Int,(Int) => Int)Int

scala> test(3, foo())
res60: Int = 11


すごいですね!

引数として関数を指定する場合はちょっと書き方今までに無い感じだ。
型だけ明示した無名関数的な。

こういうのってJSでもできるんだね。知らなかった。
てかちゃんとJS勉強したことないからなー><
そのうちJSも勉強してみよう。