ホワイトプログラマー

40歳からSEを辞めてプログラマになりました

関数型言語としてのJavaScript(2)

最近のJavaScriptはなんか読みにくい。

括弧ばかりが目についてしまう。手続き型プログラミングを学んできた私にはとても理解し難いと感じていた。

1: var length = (array) => {
2:     return reduce(map(alwaysOne)(array));
3: };
4: length([1,2,3]);

​私はずっとJavaの開発をしてきたので、JavaScriptは少し読めればいいやぐらいに思って流していた。SIは分業制なので、JavaScriptはWebフロントエンドの方々にご対応いただけばよいと考えていた。
しかし、最近ではJavaにもラムダ式と呼ばれる形で括弧の化物が登場してきている。SIの現場ではJava8の本格採用はまだだけど、来年以降の新規開発では間違いなく採用されていく。もう、括弧の化物から逃げられないことを改めて感じている。

そんな私が関数型言語としてのJavaScriptに少し取り組んでみたので何回かに分けて記事を書いてみる。

この記事で学習できること

括弧の正体​

括弧のメリット

​​

1.括弧の正体とは

括弧の正体は一言で書くと関数である。関数には恒等関数、多項関数、無名関数、定数関数などが存在する。そして、それを活用する形としてクロージャ、サンク(thunk)、モナド、カリー化などが存在する。こういった理解の難しい概念がコメントもなくソース上で用いられていることが、初学者にとって高い壁になってしまっている。

なので、いったん上記で書いた難しい言葉は忘れてみよう。括弧は関数である。このことは覚えておくこと。

それでは、括弧(関数)のメリットについて進んでみる。

2.括弧を使うと何がいいのか?

括弧は関数だと先に記載したが、「関数とは処理をまとめることによって、共通的に利用できるものである」 と考える人が多いと思う。それは確かに一部はあっているのだけど、JavaScriptで用いられる関数では少し意味合いが異なる。c言語Javaでプログラムを書いてきている人はこの考えが強いため、関数型言語としてのJavaScriptが理解しにくいと思う。

まず、1つだけ覚えてみる。関数型言語の機能を持つJavaScriptの関数は変数に格納できる。これはJavaScriptの関数は​第一級オブジェクト(ファーストクラスオブジェクト)と言われる理由だ。難しい言葉だけど、「第一級オブジェクト=ただの値(変数)」であると考えてみよう。

これを理解するだけで、読みにくかったJavaScriptが少し読めるようになるはず。

例えば、以下のプログラムはconstantという名前の関数を作成している。また、6行目ではその関数に対して実引数"1"を渡してalwaysOneという変数を宣言している。
これにより、alwaysOneには赤字部分の関数が実引数"1"で格納されている。

ここで大事なことはalwaysOneというのは必ず"1"を返す関数であるということ。

var constant = (any) => {
    return (_) => {
        return any;
    };
};
var alwaysOne = constant(1);<200b><200b> 

​このような「関数を格納した変数がいろいろな箇所で使用されている」ことを知ることが、最近のJavaScriptを読み解く一歩となる。

でも、「この関数ってどんなメリットがあるの?」と思うかもしれない。この単純な関数でも使いみちは多岐に渡る。以下のプログラムを実行すると、配列の要素をすべて1に変換できる。これはmapという配列の中身を処理する関数に、さきほどの全てを1にする関数を引数渡ししているからである。

1: [1,2,3].map(alwaysOne);

結果→[1,1,1]​​

JavaScriptを読んでいく時には、その内部で使われている変数は関数であり、その関数をブロック({})単位で見ていくことで、意外とすんなりと読んでいくことができる。 ​上記のコードにさらにreduceという要素の値を結合していくメソッドと組み合わせることで、[1,1,1]の配列の要素を足し算し、配列のサイズを計算する関数が作成できる。

1: var length = (array) => {
2:     return reduce(map(alwaysOne)(array));
3: };
4: length([1,2,3]);

結果 → 3

JavaScriptの関数についてまとめると、JavaScriptでは関数は値と同じように扱えるため、以下のような特徴をもつことができる。

関数を引数に持つことができる

数を返す関数がつくれる

​この仕組みを高階関数と呼び、JavaScriptでは多用されるため、括弧が多くなる。 しかし、それはソースを読みづらくするものではなく、プログラムの再利用性を高めたり、障害への耐性を高めることに役立つのだ。

なお、私は以下の2冊を用いて学習した。 関数型プログラミングの基礎 JavaScriptを使って学ぶ JavaScriptで学ぶ関数型プログラミング