Skip to content

Instantly share code, notes, and snippets.

@kakikubo
Created May 9, 2015 14:22
Show Gist options
  • Save kakikubo/cf3b66bf4d93c5dd4807 to your computer and use it in GitHub Desktop.
Save kakikubo/cf3b66bf4d93c5dd4807 to your computer and use it in GitHub Desktop.
http://www.amazon.co.jp/dp/4798043761 にあるコードの一部(nodeで動かす)
#! /usr/bin/env node
// 2つの数をたす
var plus = function(a,b)
{
return a + b;
};
// 2つの数を掛ける
var multiply = function(a,b)
{
return a * b;
};
// 標準だとこう
// var s = [0,1,2,3,4,5,6,7,8,9].reduce(plus);
// console.log(s);
// reduceを再定義
var reduce = function(array, f){
var s;
for (var n = 0; n < array.length; n++){
if (n==0)
s = array[0];
else
s = f(s,array[n]); // ここでfを使う
console.info('----------');
console.info('n=', n);
console.info('array[n]=', array[n]);
console.info('s=', s);
}
return s;
};
// var after1 = reduce([0,1,2,3,4,5,6,7,8,9], plus);
// var after2 = reduce([1,2,3,4], multiply);
// mapを再定義
var map = function(array, f)
{
var array1 = [];
for (var n = 0; n < array.length; n++){
array1[n] = f(array[n]); // fを使う
console.info('----------');
console.info('n=', n);
console.info('array[n]=', array[n]);
console.info('array1[n]=', array1[n]);
console.info('array1=', array1);
}
return array1;
}
// 2倍にする
var double = function(x)
{
return x * 2;
};
var after3 = map([0,1,2,3,4,5,6,7,8,9], double);
// 1足す
var increment = function(x)
{
return x + 1;
};
var after4 = increment(5);
console.info('----------');
console.log(after4);
// 2倍して足す
var double_increment = function(x)
{
return increment(double(x));
}
var after5 = double_increment(5);
console.info('----------');
console.log(after5 );
// 足して2倍
var increment_double = function(x)
{
return double(increment(x));
}
var after6 = increment_double(5);
console.info('----------');
console.log(after6 );
// f は1足す gは2倍する
var f = increment;
var g = double;
/**
* ひとつひとつかいていくならこう
*/
/**
var fg = function(x)
{
return g(f(x));
};
var gf = function(x)
{
return f(g(x));
};
var ff = function(x)
{
return f(f(x));
};
var gg = function(x)
{
return g(g(x));
};
console.info('----------');
console.log(f(5));
console.log(g(5));
console.log(fg(5));
console.log(gf(5));
console.log(ff(5));
console.log(gg(5));
**/
// 2つの関数を順に実行した関数を返す
var compose = function(f, g)
{
var fg = function(x)
{
return g(f(x));
};
return fg;
};
var fg = compose(f, g);
var gf = compose(g, f);
var ff = compose(f, f);
var gg = compose(g, g);
console.info('----------');
console.log(f(5));
console.log(g(5));
console.log(fg(5));
console.log(gf(5));
console.log(ff(5));
console.log(gg(5));
var fggf = compose(fg, gf);
console.info('----------');
console.log(fggf(5));
//rangeの再定義
var range = function(n)
{
var array = [];
for (var i = 0; i < n; i++){
array[i] = i;
}
return array;
};
console.info('----------');
console.log(range(10));
// 奇数を求める
var even = function(x)
{
return x * 2 + 1;
};
var after7 = map(range(10), even);
console.info('----------');
console.log(after7);
var after8 = reduce(range(10), plus);
console.info('----------');
console.log(after8);
var after9 = reduce(range(1000), plus);
console.info('----------');
console.log(after9);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment