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
とりあえず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
ここは同じか。両方ともクロージャだし、同じか。