関数型言語, Haskell, C・C++, C#, Java, Python, Ruby, JavaScript, Go, Swift, Rust
この記事を読むのに必要な時間:およそ 1 分
『[増補改訂]関数プログラミング実践入門──簡潔で、正しいコードを書くために』
(2016年9月,技術評論社)より転載
「関数プログラミング」は,関数型言語プログラマのみならず,すべてのプログラマにとっても急激に身近なものになってきました。2014年に初版を執筆した後,このたび増補改訂を進めてきた間にも,関数型言語での関数プログラミングだけではなく,既存の言語で関数プログラミングをしてみようといった試みを綴るインターネット上の記事や書籍についても少しずつ増加してきています。関数プログラミングは,ますます多くのソフトウェア技術者の人口に膾炙(かいしゃ)する(広く知れわたる)ようになってきています。
みなさんがよく知るメジャーな命令型言語の最近のバージョンでも,関数プログラミングのエッセンスを取り入れた機能が入ってきています。すなわち,たとえ関数型言語を使わない人であっても,使っている言語の新機能をうまく取り入れて開発を続けていくためには,関数プログラミングを学ぶ必要が出てきたということでもあります。
関数プログラミングは,その名のとおり「関数」を基本単位とし,関数の組み合わせでプログラムを構成します。関数プログラミングというスタイル自体は,実用的な言語であれば,恐らくどの言語でも可能です。しかし,やはり関数プログラミングを行いやすいのは,そのために作られた関数型言語ということになるでしょう。
耳にあるいは目にしたことがあるかもしれませんが,関数プログラミングにはさまざまな噂が存在します。
曰(いわ)く,「簡潔なコードで済む」
曰く,「安全でバグらせにくい」
曰く,「並列化しやすい」
等々。火のない所に煙というわけでもありませんが,これらの噂が出てくるにはそれなりの理由が存在します。
とくに本書初版が執筆された2014年は,広く使われているオープンソースソフトウェアの深刻な脆弱性が立て続けに発覚しました。みなさんの中にも対応に追われることになった方がいるのではないでしょうか。この状況は,今回の改訂版の執筆中も,残念ながらほぼ変わりはありませんでした。
もちろん「if」(もしも)の話をしても,まったく詮無(せんな)きことではありますが,複雑な仕様に対してもコードが簡潔に保ちやすい言語,あるいは,プログラマの些細なミスも敏感に検出する安全な言語が使われていたならば,もしかすると防げていたものがあったかもしれません。噂に挙げられたような特性がもし本当であるのならば,関数プログラミングは,世界中の人々が脆弱性対応のために浪費してしまった時間を,丸々なかったことにできたかもしれないのです。
本書は,関数プログラミングや関数型言語とは一体どういうものなのかを明らかにします。その中で,前述したような噂が出てくる理由も示します。最終的に,みなさんの道具箱の中の一つとして,関数プログラミングの基礎を加えます。この道具は,実際に関数型言語を使う場合のみならず,みなさんが普段使っている言語にまで活かせる道具となるはずです。
関数プログラミングや関数型言語に関する書籍は,すでにいくつか存在しています。本書では,関数型言語としてHaskellを説明に用います。とりわけ,関数プログラミングの基礎のほか,以下の2点に力を入れています。
- 関数型言語での設計方法/思考方法
- 他言語と関数型言語の比較対照
本書の想定読者は,これまでに他の言語をそれなりに使ってきていて,これから関数プログラミング/関数型言語も志す方々および学生の方々です。
本書では,よく知られた言語との比較を多めにすることで,関数型言語が持つ利点/欠点などの差異が明確になるようにしました。ここには,単純な比較だけではなく,関数型言語の特定の有用な機能を別のメジャーな言語に取り入れようとするとどうなるかといった話も含まれます。
そして,「関数プログラミングにおける思考方法」は,よく知られた構造化プログラミングやオブジェクト指向プログラミングのそれとはかなり違います。他の関数プログラミング関連書籍を読んだことのある方でも,ともすれば「どう考えて書いていったら良いか」設計方法/思考方法がピンとこない方がいるかもしれません。書き方がわかっても,考え方が伴わなければ,プログラムとはそうそう書けるものではありません。そのため本書では,関数型言語で関数プログラミングを行う際,どのように考えを進めていけば関数型言語らしい簡潔なコードになるかを説明しています。
読者のみなさんが,本書から安全なプログラムを記述するための知見を手にし,関数型言語によって,あるいは,みなさんが関わることになる言語に知見を取り入れることによって,より良い未来を築き上げていく一助になればと思います。
関数型言語, Haskell, C・C++, C#, Java, Python, Ruby, JavaScript, Go, Swift, Rust