LoginSignup
13
14

More than 5 years have passed since last update.

JavaScriptで学ぶ関数型プログラミング(1章)

Last updated at Posted at 2016-07-31

今日から、オライリー本のJavaScriptで学ぶ関数型プログラミング(https://www.oreilly.co.jp/books/9784873116600/ )を読破していきたいと思う。

その内容を章ごとにまとめて記事にしていきます

今回のテーマはこちら

1章 関数型JavaScriptへのいざない

Underscore.js 関数型プログラミングをサポートする

Underscore.jsの関数を呼ぶためには、.times()のようにのメソッドを呼ぶ。
jQueryでいう$ですね。

関数型プログラミングの特性

関数型プログラミング・・・戻り値として関数を返す関数を定義する
・例えるなら関数型プログラミングは、原料を入れると徐々に製品を組み立てていく組み立てラインの機械であると表現できる。
・オブジェクト指向と対比させると,このような違いに置き換えられる
- オブジェクト指向 物事を「名詞」で分ける
- 関数型プログラミング 物事を「動詞」で分ける

〜型プログラミングの種類

関数型プログラミング
- scala Clojureなど

宣言型プログラミング 
- SQLなど

命令型プログラミング
- FORTRAN、C言語、Javaなど

詳しくは2章で・・・

動作単位としての関数

定義済みの配列から指定した要素番号の要素を取り出すnaiveNth(nth関数)

var letters = ['a','b','c'];

function nth(a, index) {
    return a[index];
}

nth(letters, 1);    // => b

2番目の要素を返す動作を抽象化したsecond関数

function second(a) {
    return nth(a, 1);
}

second(['a', 'b']);     // => b
second(["fogus"]);      // => o

Array#sortメソッド
- comparator()を持つ
comparator() - JavaScriptの基本的動作単位の一つ。二つの値を引数に取り,第一引数 - 第二引数を返す

Array#sortメソッドがデフォルトで持つcomparatorは配列内の要素を文字列に変換して比較を行い,辞書順にソートする
[2, 3, -1, -6, 0, -108, 42, 10].sort(); // => [-1, -108, -6, 0, 10, 2, 3, 42]
これではダメだ。文字列的に並び替えるのではなく、数学的に並び替えるためにはどうすればいいのか。
多くのJavaScriptプログラマは以下のように書くだろう

[2, 3, -1, -6, 0, -108, 42, 10].sort(function(x, y){
    if(x < y) return -1; 
    if(x > y) return 1;
    return 0;
})

// => [-108, -6, -1, 0, 2, 3, 10, 42]

無名関数に命名する場合はこう。同じ結果が得られる

function compareLessThanOrEqual(x, y){
    if (x < y) return -1;
    if (y > x) return 1;
    return 0;
}

[2, 3, -1, -6, 0, -108, 42, 10].sort(compareLessThanOrEqual);

他の例

function nth(a, index){
    return a[index];
}

function second(a) {
    return nth(a, 1);
}

function third(a) {
    return nth(a, 2);
}

/*____________CSVファイルを読み込み、それを配列に格納するための関数_________________*/

function lameCSV(str){
    return _.reduce(str.split("¥n"), function(table, row){
            table.push(_.map(row.split(","), function(c){return c.trim()}));
            return table;
        },[]);
};

/*___________________________________________________________________________*/


function selectNames(table){
    return _.rest(_.map(table, _.first));
}


function selectAges(table){
    return _.rest(_.map(table, second));
}

function selectHairColor(table){
    return _.rest(_.map(table, third));
}

var peopleTable = lameCSV("name,age,hair¥nMerble,35,red¥nBob,64,blonde");
console.log(peopleTable);
function existy(x) { return x != null };    //return文の後に条件式が来た場合trueかfalseが返り値となる

function truthy(x) { return (x != false) && existy(x) };

function executeIfHasField(target, name){
    return doWhen(existy(target[name]), function(){
        var result = _.result(target, name);
        console.log(['結果は', result].join(''));
    });
}

executeIfHasField([1,2,3], 'reverse');
executeIfHasField({foo: 42}, 'foo');
executeIfHasField([1,2,3], 'notHere');

1章では主に関数型プログラミングとは何か、関数型プログラミングの例を学んだ.

2章 → coming soon

13
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14