object myapp {毎度登場した、totalメソッドの例です。引数を2つにし、最小値と最大値を指定して、その間の整数の合計を計算するようにしてみました。これ、例えば「0~100まで」「0~200まで」というように、第1引数の最小値が同じで最大値だけが違う、というような利用の仕方ができればけっこう便利ですね。――そこでカリー化です。
def main(args: Array[String]) = {
println("100から200までの合計:" + total(100, 200))
}
def total(min: Int, max: Int) = {
var res:Int = 0
for(n:Int <- Range(min,max + 1))
res += n
res
}
}
object myapp {なんだか不思議な形になりましたね。ここではcurryTotalというメソッドを定義してあります。これは、以下のようになっています。
def main(args: Array[String]) = {
val curryobj = curryTotal(100)
println("100から200までの合計:" + curryobj(200))
println("100から500までの合計:" + curryobj(500))
println("100から1000までの合計:" + curryobj(1000))
}
def curryTotal(min: Int) = (max: Int) => {
var res:Int = 0
for(n:Int <- Range(min,max + 1))
res += n
res
}
}
def curryTotal(min: Int) = (max: Int) => ……処理……curryTotal(min: Int)に、(max: Int)の関数オブジェクトが設定されているような形になっていますね。そしてこれを利用する側では、まず、
val curryobj = curryTotal(100)としてcurryobjに値を代入しています。これで、curryobjには、(max: Int)の関数オブジェクトが代入された形になります。後はこの定数curryobjを使い、
println("100から200までの合計:" + curryobj(200))こんな具合に、最大値だけをいろいろと指定して呼び出し処理すればいい、というわけです。もし、両方の引数を指定して利用したければ、
println("100から500までの合計:" + curryobj(500))
println("100から1000までの合計:" + curryobj(1000))
curryTotal(0)(50)こんな具合にして引数をしていすれば、最小値と最大値をまとめて指定し呼び出すこともできます。どちらのやり方も行えるのがカリー化の利点です。
※リストが表示されない場合
AddBlockなどの広告ブロックツールがONになっているとリストなどが表示されない場合があります。これらのツールをOFFにしてみてください。
●リスト1――カリー化する前の例 object myapp { def main(args: Array[String]) = { println("100から200までの合計:" + total(100, 200)) } def total(min: Int, max: Int) = { var res:Int = 0 for(n:Int <- Range(min,max + 1)) res += n res } } ●リスト2――カリー化した例 object myapp { def main(args: Array[String]) = { val curryobj = curryTotal(100) println("100から200までの合計:" + curryobj(200)) println("100から500までの合計:" + curryobj(500)) println("100から1000までの合計:" + curryobj(1000)) } def curryTotal(min: Int) = (max: Int) => { var res:Int = 0 for(n:Int <- Range(min,max + 1)) res += n res } }
<< 前へ |