関数を引数にとる、高階関数を定義することもできる。
次の例は、引数の整数に関数を2度適用する関数、じゃなくてメソッドだ。Scala では関数とメソッドは別のものだけど、この高階関数という用語はどちらにも使うみたい。
scala> def double(n: Int, f: Int => Int): Int = { | f(f(n)) | } double: (n: Int, f: Int => Int)Int
見ればわかるように、n に f を2度適用している。関数引数の型の書き方に注目。で、こんなふうに使える。
scala> double(1, m => m * 2) res0: Int = 4 scala> double(2, m => m * m) res1: Int = 16
メソッドじゃなくて関数ではどうか。
scala> val doubleFunc = (n: Int, f: Int => Int) => f(f(n)) doubleFunc: (Int, Int => Int) => Int = $$Lambda$3227/682293791@36e7bd4d scala> doubleFunc(1, m => m * 2) res2: Int = 4 scala> doubleFunc(2, m => m * m) res3: Int = 16
ちゃんとできるね。