JavaScriptで学ぶ関数型プログラミング

JavaScriptで学ぶ関数型プログラミング

Michael Fogus 著、和田 祐一郎 訳
2014年01月



最近のプログラム、特に UI 系のプログラムでは、map などを使ったコードを当たり前のように目にするようになりました。関数型プログラミングに由来するコードが増えてきたと思います。

関数型プログラミングの考え方は新しいものではありませんが、最近のプログラミング言語は、関数型プログラミングっぽいスタイルのコードが書けるように、これらの機能を標準レベルでサポートする傾向にあると思います。

そうなると、map や filter などを単なる便利な機能という使い方から少しレベルを上げて、関数型プログラミングとはどのようなものか?ということを知りたくなります。

とはいいつつも、実務で Haskell のような言語を使うわけではないので、実務に直接役立ちそうなレベルで関数型プログラミングのエッセンスを知りたい、というのも人情です。

そんな時にお勧めしたいのが今回取り上げる本「JavaScriptで学ぶ関数型プログラミング」です。

以下はこの本のスタンスと思われる記載(5.2)を抜粋したものです。
  • 本書は関数型プログラミングの美徳を熱く説くものではありません。世の中には様々な関数型のテクニックが存在し、それぞれがソフトウェア開発における複雑性を飼いならすための手段となります。しかし同時に、個々の実装においては、よりよい方法があることに気づくこともあります。
  • 普段からあなた自身の個人的な興味とニーズを深く追っておくことで、アプリケーションを構築する際にそのテクニックを使うことが適切であるかどうかを判断できるよう準備しておくことがプログラマーとして賢明であると言えます。
  • 本書は関数型プログラミングの本ですが、同時に、何にもまして、問題とその解決方法を理解する力とそこで使える引き出しを持っているということが、その場その場でとるべき最善のソリューションにつながるものであると信じています。

とはいいつつ、オブジェクト指向スタイルと関数型スタイルの違いに触れながら、JavaScript を使って関数型プログラミングの美徳を熱く説いています(笑)。

初版が 2014年ということで少し古い感じはしますが、今読み返しても面白かったので、書き留めておくことにしました。

<本の内容>

目次を見ると関数型プログラミングに関連する概念がかなり取り上げられていると思います。但し、関数型言語の理論的な本ではないため、学問的な話はありません。

【目次】
  • 1章 関数型JavaScriptへのいざない
    • 1.1 JavaScriptに関する事実
    • 1.2 関数型プログラミングを始めるために
    • 1.3 Underscoreについて
    • 1.4 まとめ
  • 2章 第一級関数と作用的プログラミング
    • 2.1 第一級要素としての関数
    • 2.2 データ思考
    • 2.3 まとめ
  • 3章 JavaScriptにおける変数のスコープとクロージャ
    • 3.1 グローバルスコープ
    • 3.2 静的スコープ
    • 3.3 動的スコープ
    • 3.4 関数スコープ
    • 3.5 クロージャ
    • 3.6 まとめ
  • 4章 高階関数
    • 4.1 引数として関数をとる関数
    • 4.2 他の関数を返す関数
    • 4.3 すべてを結集:オブジェクトバリデータ
    • 4.4 まとめ
  • 5章 関数を組み立てる関数
    • 5.1 関数合成の基礎
    • 5.2 変異は低レイヤーでの操作
    • 5.3 カリー化
    • 5.4 部分適用
    • 5.5 並べた関数を端から端までcompose関数でつなぎ合わせる
    • 5.6 まとめ
  • 6章 再帰
    • 6.1 自身を呼ぶ関数
    • 6.2 再帰多すぎ!(トランポリンとジェネレータ)
    • 6.3 再帰は低レイヤーでの操作
    • 6.4 まとめ
  • 7章 純粋性、不変性、変更ポリシー
    • 7.1 純粋性
    • 7.2 純粋と不純を分離する
    • 7.3 不変性
    • 7.4 変更コントロールのポリシー
    • 7.5 まとめ
  • 8章 フローベースプログラミング
    • 8.1 チェーン
    • 8.2 パイプライン
    • 8.3 データフロー対コントロールフロー(制御構造)
    • 8.4 まとめ
  • 9章 クラスを使わないプログラミング
    • 9.1 データ指向
    • 9.2 Mixin
    • 9.3 }).call("Finis");
  • 付録A 世の中の関数型JavaScript
  • 付録B 注釈付き参考書目
  • 付録C 本書に登場するUnderscoreの関数

<感想>

本書の1章のまとめに、関数型プログラミングは
  • 抽象を導き出して、関数として構築する
  • すでに存在する関数を使って、より複雑な抽象を構築する
  • すでに存在する関数を別の関数に渡すことによって、さらに複雑な構築する
のような技術(+データ抽象)で構成される旨の記載があります。

といわれても抽象的過ぎてよく分かりませんが、「抽象の意味とは、個別の基本的な動作を保持し、あちこちで使い回すための簡単な方法を提供すること」とも書かれています。

つまり、目的とするところはオブジェクト指向と似たようなところを目指しながらも、アプローチが違うといったところでしょうか。

本書は、前半は基礎的な内容、後半は応用的な内容を具体的なコードを示しながら進みます。例示される関数はその後に例示される関数の構築にも使われます。このことは上記の関数型プログラミングの考え方をよく表しているように思います。
(その一方で、本の読みやすさの点では、前の内容を読み返すことが多くなり、読みにくく感じるところではあります。)

ところで、この本の表紙に英語で「Introducing Functional Programming with Underscore.js」(サブタイトル?)とある通り、Underscore.js を利用したコードもあります。

Underscore.js は、関数型プログラミングをサポートした JavaScript のライブラリです。(Underscore.js からフォークした Lodash の方が有名かも?)
しかし、この本の内容は Underscore.js に強く依存しているわけではありません。

実際、最近のブラウザは、Underscore.js や Lodash のメソッドをネイティブにサポートしているものが多いため、以下のサイトを参考に JavaScript のメソッドに読み替えることもできます。(下記サイトは Underscore/Lodash のメソッドをブラウザのメソッドに置き換える例も書かれています。)

さて、話は変わりますが、この本は 2014年に出版されています。実は私は出版されて間もなくこの本を買って読みました。しかし当時の私は殆ど興味が持てず、書かれていた内容もほとんど覚えていませんでした(涙)。(大学時代に LISP や Prolog を触っていたので本の名前にひかれて衝動買いした記憶はあります。)

なぜだか考えて見ると、当時の私はオブジェクト指向モデリングを中心に仕事をしていたこともあって、プログラミングテクニックとか処理のモデルよりも、データのモデリングに強く興味を持っていたことが関係していたように思います。

オブジェクト指向系のメリット(目標?)としてよく強調されていたのは、設計からプログラミングまで一気通貫する手法であり、このこともあってか、当時は処理に関することよりも、クラス構成をはじめとするモデリングっぽい話しが多かったと思います。

実際、当時のオブジェクト指向系の本の多くは、具体的な想定アプリケーションに対してモデリング(主にUML図)とテンプレート的なコードを示すものが多かった気がします。

また、昔は OMG が CORBA を中心にサービスモデルを活発に開発していたこともあり、そちらのほうに私の興味が集中していた気がします。

一方、当時の関数型プログラミング本は、モデリングに触れることは殆どなく、実務者向けというより、学問っぽい雰囲気が強かったと思います。

この本には学問っぽい印象はありませんが、やはりデータモデリング面には殆どふれていないため(データ抽象の重要性には触れていますが)、当時はプログラミングテクニック本といった印象であまり興味が持てなかったのかもしれません。

しかし現在では業務システムと言えども対象とする領域が広がり、単一の技術でシステムを構築する時代ではなくなってきました。

この傾向はクラウドサービスの普及でさらに加速した印象があり、それがさらに今のプログラミング言語やデータベースの多様性にもつながっているようにも思えます。

今では複数の技術を組み合わせてシステムを作る時代になってきたと感じており、そこがマイクロサービスに興味を持っているところでもあります。

そのような背景もあって、今この本を読み返すと、関数型プログラミングにおける抽象化(あるいは部品化)の考え方にとても響くものがあります。

この本の内容は、プログラミングテクニックの本でもありますが、それ以上に、処理モデルの思考方法に関する本のように思えました。それはプログラミングレベルだけでなく、マイクロサービスのような分散システムを構築する上でのサービス設計や実装にもヒントを与えてくれそうです。

とはいいつつも、オブジェクト指向系のモデリングなどの知見は無駄なわけではなく、また全てが関数型プログラミングで代替可能というわけでもないので、やはり「銀の弾などない」と感じます。

結果として、この本にも書かれている
  • 問題とその解決方法を理解する力とそこで使える引き出しを持っているということが、その場その場でとるべき最善のソリューションにつながる
ということで、バランス感覚を保つためにも、偏見を持たず、様々な知見を得ておくことは大切なことだと再認識しました。

関連記事

コメント

このブログの人気の投稿

Google Document AIで画像から表形式データを抽出する(Vision API OCRとの違い)

VirtualBoxのスナップショット機能

オントロジーエディタ Protégé を使ってみる