はてなキーワード: Fnとは
javascriptライブラリMochiKitというのをご存知だろうか?
私はこのライブラリを採用して非常に開発が楽になったことから諸君にもおすすめをしたいのでサワリだけ紹介したいと思う。
配列を受け取り、それぞれを1加算した配列を返す処理を見てみよう
var arr = [1,2,3,4,5]; var v = map( function(x){return x+1}, arr);
v -> [2,3,4,5,6]
となる。
複数回同じ処理を別の配列に適応する場合は
var arr1 = [1,2,3,4,5]; var arr2 = [2,4,6,8,10]; var fx = function(x){return x+1}; var v1 = map(fx,arr1); var v2 = map(fx,arr2);
v1 -> [2,3,4,5,6] v2 -> [3,5,7,9,11]
とできる。しかしこれを書くのが面倒な怠惰な人々のためにpartialが用意されている。
var arr = [1,2,3,4,5]; var fx = partial(map,function(x){return x+1}); var v1 = fx(arr1); var v2 = fx(arr2);
v1 -> [2,3,4,5,6] v2 -> [3,5,7,9,11]
とできる。partialは関数の第一引数から順に値を指定した関数を作る関数だ。
この場合はmap関数の一つ目の値をfunction(x){return x+1}に指定した関数がfxに束縛される。
もう少々一般化して配列を受け取り、それぞれをn加算した配列を返す処理を考えてみよう。
var arr = [1,2,3,4,5]; var n = 10; var add = function(n,x){return x+n}; var fx = partial(map,partial(add,n)); var v1 = fx(arr); n = 1; var v2 = fx(arr);
v1 -> [11,12,13,14,15] v2 -> [11,12,13,14,15]
ここでv1とv2の値が等しい理由はちょっと考えてもらえば解ると思う。
もちろんaddという名前を考えるのが面倒な人は
var n = 10; var fx = partial(map,partial(function(n,x){return x+n},n));
と書いても問題ない。
では、配列を受け取り、それぞれを値をn加算したあとm倍した配列を返す処理をみてみよう。
既にn加算する処理は一度出てきているからそれを利用する。
var arr = [1,2,3,4,5]; var n = 10; var m = 2; var add = function(n,x){return x+n}; var mul = function(n,x){return x*n}; var addMul = compose(partial(mul,m),partial(add,n)); var fx = partial(map,addMul); var v = fx(arr);
v -> [22, 24, 26, 28, 30]
compose(f1, f2, ..., fN)はf1(f2(arguments))という評価をする関数をかえす。
つまりaddMul(n)の場合はpartial(mul,m)(partial(add,n)(N))と等価なのだ。
もちろん
var arr = [1,2,3,4,5]; var n = 10; var m = 2; var fx = partial(map, compose(partial(function(n,x){return x*n},m), partial(function(n,x){return x+n},n))); var v = fx(arr);
とかいてもよい。ただし名前を考えることの労力と、可読性を天秤にかける必要があるかもしれない。
ちなみに私は addMulを別の場所で使わない限り後者で書くことが多い。
にいってみてはどうだろうか。