SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.10<<123456789101112131415161718192021222324252627282930>>2017.12
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

たまたま調べごとをしていて、「カリー化」という言葉を知った。

ま、意味などはWikipediaなどを調べていただくとして、ちょっとJavaScriptで汎用的に書けるかな?と思い、書いてみる。
Function.prototype.curry = function() {
var uncurried = this;
var curried = function() {
var leading_arg = Array.prototype.slice.apply(arguments);
return function() {
return uncurried.apply(this, Array.prototype.concat.apply(leading_arg, arguments));
};
};
curried.uncurry = function(){return uncurried;}
return curried;
};



テスト用に書いたスクリプト
window.onload = function() {
var body = document.getElementsByTagName("body")[0];

var add_curry = add.curry();
body.innerHTML += "add.curry(2)(3)="+add_curry(2)(3)+"<br>";

var sub_curry = sub.curry();
body.innerHTML += "sub.curry(5)(4)="+sub_curry(5)(4)+"<br>";

var add_original = add_curry.uncurry();
body.innerHTML += "add_original(3,4)="+add_original(3,4)+"<br>";
};

function add(x,y)
{
return x+y;
}
function sub(x,y)
{
return x-y;
}



出力結果がこれ。
add_curry(2)(3)=5
sub_curry(5)(4)=1
add_original(3,4)=7



カリー化はこれで合ってると思うが、非カリー化はこんなんでいいんだっけ?


2010.7.29 仕様を変えた。
関数 f(x,y) をカリー化した g があるとき f(x,y) = g(x)(y) が成り立つのだから、fでカリー化とは g を返さなければならない。そして、g を非カリー化は f を返さなければならない。...と思う。前回の記事では、g を得ることができず、g(x) しか得ることができなかった。
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。