関数を引数に取る関数を定義することができる関数を高階関数と呼び、Go, JavaScript, Python などのプログラミング言語では高階関数をサポートしています。
この機能を使うことで、関数を引数に取る関数を定義することができます。また、関数を返す関数を定義することもできます。
何を言っているかわかりづらくなってきたのでGoで具体的な例を見てみましょう。
高階関数
func highOrderFunc(f func(int) int) func(int) int {
return f
}
この関数のように関数を引数に取ることや、関数を返すことができます。
カリー化
カリー化とは、関数を部分適用することで新しい関数を作ることです。
もう少し詳細に説明すると複数の引数を取る関数を、一つの引数を取る関数の連続で表現することです。
f(x, y)
という関数をカリー化すると、f(x)(y)
という形になります。
この状態をGoで表現してみましょう。
func curriedAdd(x int) func(int) int {
return func(y int) int {
return x + y
}
}
func main() {
// カリー化のサンプル
c1 := curriedAdd(1)
fmt.Println(c1(2)) // 3
}
関数を引数に取る関数を定義することで、カリー化された関数を作ることができます。
currriedAdd(1)
という関数を呼び出すことで、x
に 1
が適用された関数が返され、その関数に引数 2
を適用することで 3
が返されます。
このように関数が取る一部の引数をあらかじめ固定して残りの引数を後から適用することで、新しい関数を作ることができ、この手法を部分適用と呼びます。
まとめ
関数のカリー化は関数を部分適用することで新しい関数を作る手法で、共通化された処理を関数に閉じ込めることで、コードの再利用性を高めることができます。