Groovy と Scala でのカリー化

今まで知らなかったのだが、Groovy に関数型言語で有名なカリー化(currying)のための仕組みが用意されていたので試してみた。

Groovy でのカリー化

やり方は非常に簡単で、クロージャに定義される curry() メソッドにカリー化する引数を渡してやれば、指定した引数でカリー化されたクロージャが生成される。

//クロージャの定義
def f = {x, y, z ->  x + y + z}

//x の値に 100、 y の値に 20を指定したクロージャが生成される
def f1 = f.curry(100, 20)

//z の値を指定して結果を取得
println f1(3)

//x の値に 1 を指定したクロージャが生成される
def f2 = f.curry(1)

//y と z の値を指定して結果を取得
println f2(20, 300)

//f2 に y の値に 20 を指定したクロージャが生成される
def f3 = f2.curry(20)

//z の値を指定して結果を取得
println f3(3000)

実行結果は以下のようになる。

>groovy currySample.groovy
123
321
3021

Scala でのカリー化

JavaVM 上で動作する関数型言語の特徴を取り入れたオブジェクト指向スクリプト言語 Scala でのカリー化も試してみた。

Scala では関数の引数定義を複数記述するみたいなので、一つの関数定義に対して Groovy のようにカリー化時の引数を増やしたり減らしたりするような事は基本的にできない模様。

def f(x: int, y: int)(z: int) = x + y + z

val f1: int => int = f(100, 20)

//z の値を指定
println(f1(3))

//x, y, z の値を一度に指定
println(f(1, 2)(3))

実行結果は以下のようになる

>scala currySample.scala
123
6