【Scala】A => B => C 型の関数の意味
Scalaのコードを読んでいると、時々 val f: A => B => C
のような関数が出てくることがある。見るたびに少し混乱していたので整理。
この A => B => C
は A => (B => C)
と等しい。すなわち、型Aの引数を渡すと、 B => C
である関数が返ってくるということ。高階関数の一種といえる。
そもそも X => Y
のような表記は無名関数(関数リテラル)の記法であり、実際は Function1[X, Y]
型のオブジェクトである。Function1は引数を1個取る関数と同等の無名クラスを定義できるTraitであり、Xが引数の型、Yが返り値の型となる。例えば a => a + 1
という簡単な関数は、実際には Function1 型のオブジェクトであり、以下と同義である。
val plus1 = new Function1[Int, Int] { def apply(a: Int): Int = a + 1 }
これをふまえて val f : Int => Int => Int = a => b => a + b
という関数を考えると、これは Int
を引数とし、 Int => Int
の無名関数(すなわち Function1[Int, Int]
型のオブジェクト)を返している。そのため、例えば f(2)
としたとき、 b => 2 + b
という関数オブジェクトが返されている。この関数にbの値を渡せば返り値はInt型となるため、 f(2)(3)
とすると5
が返される。