groovyでのメソッドとクロージャって記法的に可換じゃなくね?

メソッドとクロージャの違いについて、直観的に同じようにに扱えないことにストレスを感じつつ、備忘録。

関数とクロージャでの乗算の定義

// メソッドでの定義
def mulm( numa, numb ){
	numa * numb
}
// クロージャでの定義
mulc = { numa, numb ->
	numa * numb
}

println "mulm(2,10): ${mulm(2,10)}" // mulm(2,10): 20
println "mulc(2,10): ${mulc(2,10)}" // mulc(2,10): 20

スクリプト的利用でクロージャを用いるとき、defを付けると他のメソッドから見えなくなるから、defを付けない。

とりあえず2倍する処理を定義する

// メソッドをラップするメソッドでの定義
def mulm2m( num ){
	mulm(2, num)
}
// メソッドから部分適用で生成されるクロージャでの定義
def mulm2c = this.&mulm.curry(2)
// クロージャをラップするメソッドでの定義
def mulc2m( num ){
	mulc(2, num)
}
// クロージャから部分適用で生成されるクロージャでの定義
def mulc2c = mulc.curry(2)

println "mulm2m(10): ${mulm2m(10)}" // mulm2m(10): 20
println "mulm2c(10): ${mulm2c(10)}" // mulm2c(10): 20
println "mulc2m(10): ${mulc2m(10)}" // mulc2m(10): 20
println "mulc2c(10): ${mulc2c(10)}" // mulc2c(10): 20

メソッドの場合、レシーバ(この場合はthis)と&を明記する必要あり。

乗算のカリー化

// メソッドのカリー化
def mulmc = this.&mulm.&curry
// クロージャのカリー化
def mulcc = mulc.&curry

println "mulmc(2)(10): ${mulmc(2)(10)}" // mulmc(2)(10): 20
println "mulcc(2)(10): ${mulcc(2)(10)}" // mulcc(2)(10): 20

カリー化って、これで良いんだっけ。カリー化そのものの関数は、fを受け取って、f.&curryを返すような関数を作れば良いのか?

カリー化後の部分適用

def mulmc2 = mulmc(2)
def mulcc2 = mulcc(2)

println "mulmc2(10): ${mulmc2(10)}" // mulmc2(10): 20
println "mulcc2(10): ${mulcc2(10)}" // mulcc2(10): 20

ここは同じか。両方ともクロージャだし、同じか。