curry化

今日から少しずつ、FP in Scalaを最初からもう一度読み進めている。
勉強会は正直全然ついていけていないのだけど、勉強会が最後まで読み進めてしまう前に追いつきたい所存であります。

とりあえずパートⅠの第Ⅱ章まではなんとか理解。
この辺は前もぼんやり理解出来ていたように思っていたけど、今回はきっちりと。

FP in Scala Exercise 2.3〜2.5

[code lang=”scala”]
import java.awt.Robot
import java.awt.print.Book
object Lesson {
def main(args: Array[String]) {
//curry化
//A,Bの2つの型の値を受け取ってCを返す関数を引数に、Aの型の引数を受け取って「Bを引数にCを返す関数」を返す。(とシグネチャが宣言している)
//実際には、A型のaの値を受けとると、「B型のbの値を受け取って、最初に受け取った『A型のaの値とB型のbの値を引数受け取ってC型を返す関数』に適用させたものを返す関数」を返す。
def curry[A, B, C](f: (A, B) => C) : A => (B => C) = a => b => f(a, b)

val func = curry((x: Int , y: Float) => x.toString() + y.toString())
val func2 = func(10)
val func3 = func2(10.0f)
println(func3)

}

def uncurry[A, B, C](f: A => B => C) : (A, B) => C = (a, b) => f(a)(b)

def compose[A, B, C](f: B => C, g: A => B) : A => C = a => f(g(a))
}[/code]

そもそも前にこの辺読んだ時には型の事もオブジェクト指向の事もぼんやりとしか解っていなかったし、高階関数の事も微妙だったのでcurry化自体は「なんとなく理解できていたつもり」だったけど、それ以前の事がぼやぼやだった。
今の所順調なので、このペースをキープしたいけど、いつまでもつかな…?