【Scala】A => B => C 型の関数の意味

Scalaのコードを読んでいると、時々 val f: A => B => C のような関数が出てくることがある。見るたびに少し混乱していたので整理。

この A => B => CA => (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 が返される。