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}")