Scalaカレー(Scala関数型デザインより)
久しぶりのブログ更新です。
最近、Scalaを復習中。
Scalaの関数型部分をよく理解せずに使っていたので、すごいHaskell本を読んで
さらに「Scala関数型デザイン&プログラミング」を読んでいる。
「2. 6 型 に従う 実装」のカリー化
まず最初に、以下のコマンドで、scalaプロジェクトのスケルトンを生成
sbt new sbt/scala-seed.g8
プロジェクト名は、「fp」にしてみた。
def curry[A,B,C](f: (A, B) => C): A => (B => C) =
a => b => f(a, b)
2個の引数(A,B)を取る関数をもらうと、カリー化した関数を返す。
package example object Curry { def curry[A,B,C](f: (A, B) => C): A => (B => C) = a => b => f(a, b) def main(args: Array[String]): Unit ={ val fnAdd = (a :Int, b:Int) => a + b val cryAdd = curry(fnAdd) println(s"cryAdd(3):${cryAdd(3)}") println(s"cryAdd(3)(5):${cryAdd(3)(5)}") } }
こんな感じで、2個の引数を足し算する関数(fnAdd)が、カリー化される(cryAdd)
逆にカリー化から、戻す場合は、以下となる。
def uncurry[A, B, C](f: A => B => C): (A, B) => C =
(a, b) => f(a)(b)
val ur = uncurry(cryAdd) val uuu = ur(3,5) println(s"uuu:${uuu}")