部分適用とカリー化
部分適用
まず普通の関数。
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
とりあえず現時点では知識として整理しておくにとどめます。