関数はカリー化された関数といえます。変数の値の変更に対しておおらかな言語です。オブジェクト指向のカプセル化のような事をする場合、クロージャを使うと便利です。クロージャを使うと、生成時のコンテキストにもとづいて特定の動作を行うように「設定された」関数を返すことができます。この設定された関数は外部からカプセル化されており、関数の抽象を高めます。カリー化された関数も同じ考え方になります。カリー化を行う意味まず、シンプルな高階関数をつくります。関数を引数に取り、引数をひとつだけ取るように限定された関数を返す関数です。引数をいくら渡してもエラーになりません。そこで、いくつかの「専門化を行う」引数をオプションで取る場合がよくあります。オプションで受け取ります。第一級関数として使うと第2引数が原因で混乱するケースがあります。そのため、こんな結果になってしまいます。与えられた関数に一つだけ引数を渡すように強制してみます。