メニューを閉じる

テクノデジタルグループ

メニューを開く

2014.08.29

プログラミング

カリー化とか部分適用とかのお話

こんにちは、KTです。

今回はカリー化とか部分適用について簡単に紹介します。(あまり興味ない人が多そうな話題ですが・・・)

まずはカリー化から。

カリー化って?

複数の引数を受け取る関数を、最初の引数を受け取って、残りの引数を受け取る関数を返す関数に変換することをカリー化といいます。英語で書くとcurryなんですが、決して食べ物のカレーではなく、提唱者の名前らしいです。

 

上の説明だとピンと来ないですよね?

例えば

function hoge(a, b, c) {
    // a, b, cを使った処理
}

のように3つの引数を受け取る関数を

function hoge_curry(a) {
    return function (b) {
        return function (c) {
            // a, b, cを使った処理
        }
    }
}

のように変換することです。引数ごとに分解したイメージですかね。

カリー化すると、もちろん関数の呼出方法も変わっちゃいます。

hoge(a, b, c);

hoge_curry(a)(b)(c);

え?むしろ面倒になったじゃないかって?

確かにただ単にカリー化しただけでは分かりにくく面倒になるだけなので、むやみやたらにカリー化するのはオススメしません。

じゃあどんなときにカリー化すればいいのか。を次に説明します。

 

カリー化と部分適用

複数の引数を受け取る関数に対して、一部の引数を渡して残りの引数を受け取る関数を生成することを部分適用といいます。

関数の一部の引数を束縛(固定)してしまった関数を新たに作り出す。ということですね。

例えば、

function log(level, msg) {
    // ログを出力する処理
}

のような、ログレベルとメッセージを受け取る関数があったときに、

log('debug', 'message');

のように毎回ログレベルを指定するのが面倒ってことありますよね?

おそらく、ほとんどの場合は

function debug_log(msg) {
    log('debug', msg);
}

のようなログレベル毎のラッパー関数を作るのではないでしょうか?

 

ここで、カリー化と部分適用を使うと、ラッパー関数を作る必要を無くすことが出来ます。

まずはlogにカリー化を行って

function log(level) {
    return function (msg) {
        // ログを出力する処理
    }
}

次に、levelを束縛すると、

var debug_log = log('debug');

debug_log('message!!');

このように、ラッパー関数を作ることなくレベル毎のloggerを得ることが出来ました。

 

カリー化には、部分適用のために使う以外にも、いろいろと便利な使い方があるらしい(思い浮かばなかった)ので、是非頭の片隅にでも置いておいてください。

 

ちなみに、

  • 関数を引数ごとに分解すること→カリー化
  • 分解した関数にたいして、一部の引数を束縛すること→部分適用

ですので、お間違えの無い様。

間違えると怒る人がたくさん居ますので。


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事