Skip to content

Instantly share code, notes, and snippets.

@k2works
Last active March 18, 2022 08:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k2works/b21854066b230d3c5f7a1eda4f35091b to your computer and use it in GitHub Desktop.
Save k2works/b21854066b230d3c5f7a1eda4f35091b to your computer and use it in GitHub Desktop.
JavaScriptで学ぶ関数型プログラミング
var assert = require("assert");
//var _ = require("/Users/kakim/scoop/apps/nvm/current/nodejs/v12.21.0/node_modules/underscore");
//var _ = require("/Users/kakim/scoop/apps/nvm/current/nodejs/v16.3.0/node_modules/underscore");
var _ = require("/usr/local/lib/node_modules/underscore");
var lyrics = [];
for (var bottles = 99; bottles > 0; bottles--) {
lyrics.push(bottles + " 本のビールが残っている");
lyrics.push(bottles + " 本のビールが");
lyrics.push("ひとつ取って、隣に回せ");
if (bottles > 1) {
lyrics.push(bottles - 1 + " 本のビールが残っている");
} else {
lyrics.push("もうビールは残っていない");
}
}
function lyricSegment(n) {
return _.chain([])
.push(n + " 本のビールが残っている")
.push(n + " 本のビール")
.push("ひとつ取って、隣に回せ")
.tap(function (lyrics) {
if (n > 1) lyrics.push(n - 1 + " 本のビールが残っている");
else lyrics.push("もうビールは残っていない");
})
.value();
}
lyricSegment(9);
function song(start, end, lyricGen) {
return _.reduce(
_.range(start, end, -1),
function (acc, n) {
return acc.concat(lyricGen(n));
},
[]
);
}
song(99, 0, lyricSegment);
var nums = [100, 2, 25];
function div(x, y) {
return x / y;
}
assert.equal(_.reduce(nums, div), 2);
assert.equal(_.reduceRight(nums, div), 0.125);
function allOf(/*1つ以上の関数*/) {
return _.reduceRight(
arguments,
function (truth, f) {
return truth && f();
},
true
);
}
function anyOf(/*1つ以上の関数*/) {
return _.reduceRight(
arguments,
function (truth, f) {
return truth || f();
},
false
);
}
function T() {
return true;
}
function F() {
return false;
}
assert.equal(allOf(), true);
assert.equal(allOf(T, T), true);
assert.equal(allOf(T, T, T, T, F), false);
assert.equal(anyOf(T, T, F), true);
assert.equal(anyOf(F, F, F, F), false);
assert.equal(anyOf(), false);
let result = _.find(["a", "b", 3, "d"], _.isNumber);
assert.equal(result, 3);
result = _.reject(["a", "b", 3, "d"], _.isNumber);
assert.deepEqual(result, ["a", "b", "d"]);
function complemet(pred) {
return function () {
return !pred.apply(null, arguments);
};
}
result = _.filter(["a", "b", 3, "d"], complemet(_.isNumber));
assert.deepEqual(result, ["a", "b", "d"]);
result = _.all([1, 2, 3, 4], _.isNumber);
assert.equal(result, true);
result = _.any([1, 2, "c", 4], _.isString);
assert.equal(result, true);
var people = [
{ name: "Rick", age: 30 },
{ name: "Jaka", age: 24 },
];
result = _.sortBy(people, function (p) {
return p.age;
});
assert.deepEqual(result, [
{ name: "Jaka", age: 24 },
{ name: "Rick", age: 30 },
]);
var albums = [
{ title: "Sabbath Bloody Sabbath", genre: "Metal" },
{ title: "Scientist", genre: "Dub" },
{ title: "Undertow", genre: "Metal" },
];
result = _.groupBy(albums, function (a) {
return a.genre;
});
assert.deepEqual(result, {
Metal: [
{ title: "Sabbath Bloody Sabbath", genre: "Metal" },
{ title: "Undertow", genre: "Metal" },
],
Dub: [{ title: "Scientist", genre: "Dub" }],
});
result = _.countBy(albums, function (a) {
return a.genre;
});
assert.deepEqual(result, { Metal: 2, Dub: 1 });
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment