2009年7月10日金曜日

カリー化

currying

というのはもちろん、
俺の研究室にはバングラデシュ人がひとりいるんだけど、
その人にカレーのつくり方を教えてもらったので、
最近スパイスを10種類くらい買い込んで、
カレー三昧の日々を送っています。
ああ、カレー化する俺の日常。


みたいな意味ではないのです。
久々にプログラミングの話。


最近バイトで、上司に内緒でPythonを使い始めた。
職場ではPerlの方が浸透してるけど、
Pythonの方が見た目が好きだから。


で、なんでか忘れたけど、ふと「カリー化」という言葉を見つけて、
関数型言語とか
クロージャとか
よくわからない!と思って今まで避けていたのをちゃんと勉強しないといけないかも、と思ってきた。

思ってきたけれど。


カリー化(currying)とは、計算機科学分野の技法の一つ。複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。
カリー化 - Wikipedia


Javascriptのカリー化の例:
function curry(f) {
if (f.length == 0) return f;
function iterate(args) {
if (args.length >= f.length)
return f.apply(null, args);
return function () {
return iterate(args.concat(Array.prototype.slice.call(arguments)));
};
}
return iterate([]);
}
JavaScript でカリー化、再び



へっ?

…さっぱりわからない。


上のリンクにある使い方の例を読んだらなんとなく分かったけど、
原理とか、メリットがよくわからない。

うーん、これはきっと、プログラマとしてちゃんとした勉強をしてないからなんだろうな、と思ったりする。
まあ別に、プログラミングは趣味みたいなもんだからいいけど。と言ってしまえばそれまでだ。でもやっぱり、曲がりなりに2年はプログラミングで稼いでいるという自負はあって、
もうちょっとちゃんとわからないと!

詳しいひとは、
これを読んだらいいよ。的なことを教えてください!


あ、ちなみに、カリー化という名前は、
ハスケル・ブルックス・カリーという論理学社の名にちなんで付けられたらしい。
食べ物のカレーとは関係がないのでした。

3 件のコメント:

brief さんのコメント...

かりーはわーどたいおうのかりーさんとかんけいありますか?

Unknown さんのコメント...

あ、調べてみたら関係あるみたい!
カリー-ハワードの、カリーというのが、関数型言語Haskelで有名なハスケル・カリーさんです。

そうか、論理学には詳しいんやっけ?

brief さんのコメント...

だれやそれ。X-S
論理学に詳しいってほどじゃないかなぁ、ホントかるく目を通したってくらい。
現に、カリー化を忘れてたくらいだし。←さっき本調べたらちゃんと線引いてた^^;

ゆるい本なので厳密なことはわからないけど。
「関数の計算に関して純粋な理論を展開するには,すべての一引数であると仮定してようように思われる.」ってかいてありますぜ。

一引数で言えることを順々にn引数まで持って行けるっていうのは便利。逆にいえば一引数に落として考えれる。

学科の問題で着眼点とかが違うかもしれんけど。変数を2つ同時に扱うより、1つずつ扱う方が便利。
N次元での積分が累次積分できる!みたいな。あと予選決勝法みたいなw

プログラミングの話には通じてないので、その辺は勘弁してちょ。