部分適用とカリー化

部分適用

まず普通の関数。

def sum(a:Int, b:Int, c:Int) = a + b + c
val result = sum(1,3,5) // 9

コレをこんなふうに出来る。第三引数を5に固定。

val sum2 = sum(_:Int, _:Int, 5)
val result = sum2(1,3)  // 9

カリー化

引数が元の関数の最初の引数で、残りの引数を取って結果を返す関数を返す関数のこと。
先ほど定義したsum関数をカリー化するには・・

val sumCurry = (sum _).curried
currySum: Int => (Int => (Int => Int)) = <function1>

実行するには・・

sumCurry(1)(2)(3) // 6

val sumCurry1  = sumCurry(1)  // sumCurry1: Int => (Int => Int) = <function1>
val sumCurry2 = sumCurry1(2)  // sumCurry2: Int => Int = <function1>

sumCurry2(3) // 6

定義としては次のようにすることも。

def sumCurry(a:Int)(b:Int)(c:Int) = a + b + c

実行は

val sumCurry1 = sumCurry(1)  // sumCurry1: Int => (Int => Int) = <function1>
val sumCurry2 = sumCurry1(2)  // sumCurry2: Int => Int = <function1>

sumCurry2(3) // 6

今のところ、こんなシーンで使ったら威力発揮しそう!というのは見えていませんw
とりあえず現時点では知識として整理しておくにとどめます。