はじめに - 技術評論社

はじめに
はじめに
前書きに代えて
関数型プログラミングは魔法のプログラミングではなく、日常生活のありふれたプログラミン
グです。しかし私が 学 生 時 代に初めて関 数 型プログラミングに出会ったときは大きなカル
チャーショックを受けました。今までのプログラミングにない香りがしました。これは今までの
延長上でない何かがある、何か新鮮な驚きがあると感じ、それ以来関数型プログラミングに浸
かっていました。最初は Lisp プログラムを作成していましたが、いつの間にか、Lisp 処理系を
作るようになり、多くの Lisp 処理系を開発してきました。Lisp マシン ELIS の開発に従事し、
さらに OKI Common Lisp(学名:Tachyon Common Lisp)や OKI ISLisp などを開発し
てきました。この中で関数型プログラミングだけでなく、オブジェクト指向プログラミングや論
理型プログラミング、そして手続き型プログラミングも実装しています。この実装を通じて、外
から、あらめて関数型プログラミングを見ることになりました。そして関数型プログラミングの
良さを再実感し、逆に足らないところや悪いところも見るようになりました。そして今は関数型
プログラミングは魔法でなく、日常生活だと感じるようになっています。
新しく関数型プログラミングの世界に入ってくる人に、この日常生活感を伝えていきたいと思
い、そして少しだけ魔法も伝えたいと思い、本書を執筆することになりました。もちろん本書は
入門書になっていますので、まずは関数型プログラミングを異質のもの=魔法として学び始め
ることになるでしょう。しかし本書はそれが目的でありません。最終的には関数型プログラミン
グを日常生活のプログラミングとして自分のものにして使ってください。
関数型プログラミングは魔法ではありません。しかし副作用のないプログラミングの世界へ
導く道標になります。この関数型プログラミングを一緒に楽しんでいきましょう。
2016 年春 五味弘
iii
はじめに
はじめに
謝辞
ト構造、貯金箱、スロットマシン、無限リスト、Lisp の構文解析、オンライン書店などを取り
本書は多くの方の協力を得て出版されました。OKI グループや各業界、友人の方々に意見を
上げて演習をします。他にも多くのものを題材にして演習していきます。第 6 章では関数型プロ
いただきました。特に多くの時間をかけて本書を査読し、多くの知見や貴重な提案を与えてく
グラムの評価やリファクタリングについて紹介しています。プログラミングだけでなく、作った
れた同僚の鈴木寿郎氏に深く感謝します。
プログラムの評価やそのリファクタリングもソフトウェア開発にとって重要な要素です。おわり
技術評論社の池本様には出版の機会をいただき、企画から査読、出版までに多くの尽力をし
にでは関数型プログラミングを再考しています。結局、関数型プログラミングで解決できること
ていただきました。本当に感謝しております。
と、解決できないことをどうしていくのかをまとめています。
本書で紹介しているプログラムは小さく、多くは単独で動作するものです。プログラムのテー
本書について
マも小さく分割しています。このために 1 つのプログラム、1 つの項目でたとえ躓いても、全部
本書は関数型プログラミングの入門書です。関数型プログラミングを学ぶ上でプログラミン
がわからなくなるということはありません。また自分が理解しやすいところから読み進めても大
グ言語 Lisp を使っていますが、Lisp の入門書ではありません。本書は他のプログラミング言
丈夫なように構成されていますので、つまみ食い的な読み方も可能になっています。
語でも適用できる関数型プログラミングの入門書になっています。このために多くの小さなプロ
本書の読み方としては速習としては、第 1 章、第 2 章、第 3 章をお読みください。Lisp を知っ
グラムで、関数型プログラミングを学んで、それを真似て、そして使いこなせるようになってい
ていれば第 2 章は読み飛ばしてもかまいません。学習用の教科書としては、第 1 章、
(第 2 章)
、
ます。
第 3 章、第 5 章で学んでください。第 4 章と第 6 章は関数型プログラミングをより広く深く学ぶた
本書を読んで、関数型プログラミングを日常の自分のプログラミングとして学び、実際に関
めに読んでください。またオブジェクト指向をよくご存じの方は、その比較を紹介している第 4 章
数型の設計と関数型プログラミングができるようになることを目的としています。またオブジェ
と第 5 章のオブジェクト指向の演習は興味ある個所になるでしょう。手続き型プログラミングから
クト指向プログラミングや手続き型プログラミングとどこが本質的に違って、どこが同じで、ど
パラダイムシフトを目指す方は第 1 章から第 5 章が貴重な助言を与えることになるでしょう。
こが優れていて、どこが悪いのかを学んでいきます。またこれらとどこを共存して、どこを排他
本書の目次の章名と節名は関数型プログラミングに関する抽象的な項目名になっています
にするのかを学びます。そして関数型プログラミングの本質である副作用のないプログラムを
が、3 段目の項(サブセクション)の名前は具体的な記述項目を書いています。目次の 3 段階目
目指し、その結果、再利用のできるプログラムを開発して、実際のソフトウェア開発に役立て
を見ることで本書で書かれている内容がよくわかるようになっています。またコラムが多いのも
ることを最終的な目的としています。
本書の特徴です。コラムは関数型プログラミングに関することから Lisp のこぼれ話まで、マニ
アックなことから裸の王様の素朴な質問まで多岐に渡っています。コラムやそれに隣接する本
本書の構成と読み方
文は読み物としても楽しめる構成になっていますので、コラムの題名から探して先に読むのも
本書は 6 章構成になっています。最初の第 1 章ではプログラムコードをあまり出さずに読み
面白いでしょう。
物として文章と図で関数型プログラミングの定義と歴史、利点を紹介し、続いて関数型プログ
ラミングがなぜ難しいと思われているのか、そしてそれをどう解決して取り入れていくのかや、
本書の対象読者
使うときのコツを紹介しています。続く第 2 章では関数型プログラミングを学ぶための Lisp の
本書では何らかのプログラミング言語を知っている人を対象にしています。一方 Lisp を知ら
最小最速の入門書になっています。第 3 章では関数型プログラミングの基本を Lisp を使って学
なくても大丈夫なように第 2 章に Lisp 入門の章が設けてありますので参照してください。そし
んでいきます。関数の定義から始まり、ラムダ算法、再帰プログラミング、イミュータブルな
て本書では以下の方を読者として想定しています。
データ、高階関数、評価戦略などを小さい Lisp プログラムを多く使って学んでいきます。第 4
iv
章ではオブジェクト指向プログラミングなどのパラダイムと関数型プログラミングの比較をして
(ⅰ)関数型プログラミングを初めて「やさしく」学ぼうとする人
います。外から関数型プログラミングを眺めることで自分自身を第 3 者の視点で評価します。
(ⅱ)関数型プログラミングの実践的なコツを「すぐに」身につけたい人
第 5 章では関数型プログラミングの演習をします。多数の小さなプログラムを中心に、簡潔で
(ⅲ)
「あらためて」関数型プログラミングを学ぼうとする関数型プログラマ
すがより深く関数型プログラミングを自分のものとして習得していきます。演習としてクイック
(ⅳ)Lisp は知っているが関数型プログラミングをあまりやっていない「 Lisper 」
ソートやハノイの塔、エイトクイーンなどの定番のプログラムから始まり、キューやドキュメン
(ⅴ)
「オブジェクト指向と比較しながら」関数型を学ぼうとするオブジェクタ
v
はじめに
(ⅵ)
「 Lisp 以外の他の関数型言語 」で躓いて、やさしい入門書を探している人
(ⅶ)他の関数型言語の関数型プログラミング入門書が「 難しくて」理解できなかった人
(ⅷ)関数型プログラミング入門書を読んでも「 関数型の良さが実感できなかった」人
(ⅸ)再帰プログラミングやリスト処理などを「 多くの小さな例 」で学びたい人
(ⅹ)関数型プログラミングの基本を小さな例を多く用いて「 教育 」に使いたい人
(ⅺ)関数型プログラミング (と/または)
「 Lisp 」に興味を持っている人
・サンプルプログラムのダウンロード
本書で紹介している Lisp のサンプルコードを以下の Web サイトで公開しています。本書で
紹介しているプログラムは小さいですが、プログラム本数は多いのでお役立てください。ただ
し、本書では同じ動作をする関数は同じ名前で説明していますが、サンプルプログラムでは別
名にしていますのでご注意ください。
また本書で紹介しているプログラムは小さいプログラムが多いので、1 個 1 個の関数を直接
キーボードで打ち込むのは比較的簡単です。そして直接打ち込むことで学習効果が上がります
ので、直接キーボードで打ち込むことを推奨しています。それに自分で打ち込んだ方が動作し
たときの喜びが違います。間違って入力したとしても愛着が沸きます。きっと Lisp の楽しさも
そこから生まれてきます。まずはプログラムを手入力してみてください。ダウンロードしたもの
をそのまま動作させてしまってはこの感動は味わえません。
◆サンプルプログラムのダウンロードサイト
・http://gihyo.jp/book/2016/978-4-7741-8035-9
vi