Training for D-Day

ブログの内容は個人の見解であり、所属する企業を代表するものではありません。

部分適用された関数(partially applied functions)

部分適用された関数


Scala、私にとっては、この辺からだんだん難しくなってくる。
「複数の引数がある場合に、あらかじめ引数の値を決めておき、あとから決まってない引数だけ指定して関数を呼び出せる」、ということという理解である。
「デフォルト引数ありの関数のもっと便利版」という理解でもいいかも知れない。


s.foreach(x => println(x))



s.foreach(println _)


上記の書き方を部分適用された関数(partially applied functions)と呼ぶ。
Scalaでは、必要な引数を渡して関数を呼び出すことを、”関数を引数に適用する”と考える(らしい)。


例えば

def sum(a:Int, b:Int, c:Int) = a + b + c

sum(1,2,3)
res1: Int = 6


と呼び出せる。

val a = sum _
a(1,2,3)
res2: Int = 6


でも同じ結果になる。

val a = sum _ 


と書くと、コンパイラが、

sumにapply(a:Int, b:Int, c:Int)


を自動生成してくれる。

例えば、第1引数だけ決まってない、第2、第3引数は決まっている場合は以下のように書ける

val a = sum(_,2,3)
a(1)
res3: Int = 6

val b = sum(_,2,_)
b(1,3)
res4: Int = 6

val c = sum(_,_,_)
c(1,2,3)
res5: Int = 6


これが部分適用された関数である。

すべてコンパイラのせいだ。

パッとは思いつかなかったが、これって結構応用できる感じがする。
引数を予め決めておきたい処理って結構あるし、テンプレートエンジンで大量のコードを書くときにも利用できそう。
どこかで使ったら載せようと思う。

コップ本読んでる。

Scalaスケーラブルプログラミング第3版

Scalaスケーラブルプログラミング第3版