Statistical Programming

Scala 関数のカリー化と部分適用

Scalaにはカリー化と部分適用という機能が備わっています。

まずはカリー化から。

カリー化とは、複数の引数を受け取る関数を一つの引数を受け取る関数の積み上げ形にすることです。もしくは、複数の引数を取る関数を一引数を取る関数のチェインにすると表現することもあります。出来上がった関数をカリー化された関数と呼びます。

たとえば、3つの引数ととりそれらを足し算する関数を定義します。

def Plus(a:Int,b:Int,c:Int):Int=a+b+c 

println(Plus(1,2,3))

 次に、その関数をカリー化します。

val curPlus=(Plus _).curried

println(curPlus(1)(2)(3))

 すると、複数の引数を受け取る関数が1つの引数を受け取る関数の合体関数みたくなりました。

 

ではところかわって部分適用について見ていきたいと思います。

Scalaにおける部分適用とは、複数の引数を取る関数のいくつかの引数にだけ値を渡すことにより残りの引数だけを受け取る新たな関数を作ることです。この部分適用は前述したカリー化とは異なるのですが同一のものだと考える方もいるらしいです。

val Mul=(a:Int,b:Int,c:Int)=>{a*b*c}:Int

println(Mul(1,2,3))

val PartMul=Mul(_:Int,_:Int,c:Int)

println(Mul(3))

 Scalaは関数を分解したり合体したりするための機能が豊富で関数との触れ合いが他の言語以上にスムーズな言語ですなあ