Scala は関数型プログラミング言語でもあるので、関数のカリー化もできる。
scala> val addCurried = (x: Int) => ((y: Int) => x + y) addCurried: Int => (Int => Int) = $$Lambda$3206/517834570@1a67f250 scala> val add1 = addCurried(1) add1: Int => Int = $$Lambda$3241/1505134204@7c676bd scala> add1(3) res0: Int = 4
いや、これ、たんに関数から関数を返してるだけじゃないか。もっとカリー化専用の構文があるのかと思った。
ところで、メソッドのほうは引数の代わりに _ (アンダースコア)を使うことで関数を得ることができる。
scala> def add(x: Int, y: Int): Int = x + y add: (x: Int, y: Int)Int scala> val addFun = add _ addFun: (Int, Int) => Int = $$Lambda$3266/46821433@2a1ea898 scala> addFun(3, 5) res2: Int = 8
そして、引数リストを複数に分けたメソッドを関数化すると、カリー化される。
scala> def addMultiParameter(x: Int)(y: Int): Int = x + y addMultiParameter: (x: Int)(y: Int)Int scala> val addM = addMultiParameter _ addM: Int => (Int => Int) = $$Lambda$3276/2016773972@70b0e2a6 scala> val add2 = addM(2) add2: Int => Int = $$Lambda$3277/527492379@5b248e9d scala> add2(3) res3: Int = 5
ふーん、なるほどね。