学習ログ3 高階関数/クロージャー/カーリー化あたり
週末は高階関数、クロージャー、カーリー化あたりを勉強してました。
高階関数 -> 関数を引数として扱ったり、返り値を関数に出来たりするやつ
クロージャー -> 関数で引数以外の変数が、定義されたときに決定されたり、関数の外で定義された変数を使えたりする
カーリー化 -> 複数の引数を持つ関数を一つの引数を持つ複数の関数に書き換えること
高階関数がつかえると、map, filter, fold, zip, unzip みたいに関数を引数にする関数を使えるようになるので、すごい効率的に関数を拡張できますね。
クロージャーは、説明難しいんですけど、定義されたときに変数の束縛決まるので、後から変数汚染されないと動作わかりやすいですね。
上の二つは前から知ってたんですけど、カーリー化は初めての概念でした。複数の引数を単一の引数の関数に変換する意味がよくわからなかったですが、関数を拡張しやすくなるみたいですね。
カーリー化すると引数を一つ減らした時の返り値が関数になるので、それをそのまま関数として使えるんですね。引数がタプルだとこれは出来ないですね。
例えば、カーリー化してないfold でsumを定義すると
fun sum xs = fold (fn (x,y)=> x + y, 0, xs)
となりますが、カーリー化したfoldであれば
val sum = fold (fn (x,y) => x + y) 0
と定義出来ます。
実際の開発だとjavascriptのアローで使えそう。
また書きます、、、
この記事が気に入ったらサポートをしてみませんか?