ひつじのにっき

mhidakaのにっきです。たまに長文、気が向いたとき更新。

クロージャやラムダ式を理解していない組込エンジニアが関数型言語を理解するチャレンジングな4冊(+6冊+α)

手続き型言語を主なフィールドとして頑張ってきた組み込みエンジニアが関数型言語に興味を持ったので相談したら以下の4冊(+6冊)の本を薦められました。順次読んでいきます。多分にチョイスが偏ってます(ので、随時補正を取り込んで下に追記してます。初出は6冊だったのですが現時点で10冊。お好みでどうぞ。一部はWebで公開されていると教えていただいたのでリンクを足しておきました。一夜明けて、さらに参考文献が沢山きたので追記しました)。


ただ全ての本を連続的に読むことでタイトルのように関数型言語がわかった!みたいな意味を成すかはわかりません(しばらくまって結果を見たほうが参考になるはずです)。1冊か章の区切りかでまとめていくので一緒に読んでくれたりお勧めの本を教えてくれたり、誤った理解をなおしてくれると更に喜びます。とりあえず全部買ったので今からスタートです

(追記:関数型言語、という入り口から入るなら「プログラミングの基礎」という本記事の最後のほうで紹介している書籍が評判良いです、あとブログを書いている本人はクロージャラムダ式を理解したほうが便利そうだ、という入り口で本を選んでもらってますので全ての関数型がこの偏ったチョイスで語れると思うなよ!という気配はたくさんしてます。より純粋に関数型言語を学びたいならこっちがいいよ、みたいな感じで色々おすすめを教えてもらえると嬉しい感じです)。


なおこういう本は本人の知識ベースに依存するところが多いように感じてますので
チャレンジャーの背景のほうも大事かな、と。一応明記しておきます。

読む人はプログラマ歴:6年
情報処理系を勉強してて数学の知識はふつうの学生相当(微分積分線形代数グラフ理論、統計解析等)。コンピュータサイエンス系は情報理論、データ構造とアルゴリズム、画像工学等。
職業としては組み込みエンジニア。LinuxRTOSからAndroidプラットフォーム関係にシフト。アプリからデバドラまで経験してますが言語はC/C++Javaで思いのほか少ない。他の言語も手習い程度には。

そのような背景なので関数型言語に関する知識があまりない。コードコンプリートやEffective Javaデザパタ本とかは読み終わってる。


まず基本的な理解について薦められた本。これはJavaScriptしたことないのにTypeScript触ろうとしたときにクロージャや無名関数の概念が良くわかって無くて「とりあえず理解しやすいやつ」という背景のもとに紹介された。

JavaScript Ninjaの極意 ライブラリ開発のための知識とコーディング (Programmers’ SELECTION)

JavaScript Ninjaの極意 ライブラリ開発のための知識とコーディング (Programmers’ SELECTION)

原本はNinjaっつってるのにサムライの絵が描かれてるミラクル。


ラムダ式についていろいろ教えてもらったあと、とりまコレよんどけって投げられた本がこちら。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

すごいH本と呼ぶらしい。この本の前にふつうのHaskellっぽいのを一段挟めとか挟まなくていいとかという議論もあった。ハイセンスなチョイスなのかもしれない。


あとこのあたりのプログラミングとは何だ、みたいなことを考えるのにポールグレアムっていう人の本を読まなきゃダメ(影響を受けたほうがいい)らしい。

ハッカーと画家の著者のポールグレアムLispプログラマ。このひとのエッセイは素晴らしいらしい。今はYコンビネーターでシードファンディングもしてる。偉い人。
Web版はこちらから(http://practical-scheme.net/trans/hp-j.html


そして今回の最終目標はこれ。

On Lisp

On Lisp

Lispをすこしかじれば式や文だけじゃなくて評価についても理解できるとのこと。実際、理解できたからと言ってプログラミングがすごい早くなるわけじゃないけど、プログラマとして身を立てるなら知っておいたほうがいい気がした(話を聞いて勝手に思っただけ)。
こちらもWeb版がある(http://web.archive.org/web/20061208031140/http://user.ecc.u-tokyo.ac.jp/~t50473/onlisp_j.pdf


あと言及された本としては以下があるけど難易度高めな感じしかしない。ので今回は読まない予定ではあるが、2冊ある。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈

ピアソンなので残念ながらすぐには手に入りそうもない。そもそも分厚すぎて心が折れるとのこと。このあたりから入門書という概念からだいぶ遠い。そろそろ聖典とかの領域なの?と思ってしまう感じがあった。原題は「Structure and Interpretation of Computer Programs」略称はSICP

原著であればWeb版があるらしい(http://mitpress.mit.edu/sicp/full-text/book/book.html)。

型システム入門 −プログラミング言語と型の理論−

型システム入門 −プログラミング言語と型の理論−

  • 作者: Benjamin C. Pierce,住井英二郎,遠藤侑介,酒井政裕,今井敬吾,黒木裕介,今井宜洋,才川隆文,今井健男
  • 出版社/メーカー: オーム社
  • 発売日: 2013/03/26
  • メディア: 単行本(ソフトカバー)
  • クリック: 68回
  • この商品を含むブログ (11件) を見る
入門って書いてあるけどライトさはかけらも感じない。原題は「Types and Programming Languages」なので型について言及するんだったら読んでおけよ、ぐらいのレベルなのかな、と。もしかしたら登山家がエベレスト上るまえにチャレンジする前のマッターホルンのようなものなのか。気を抜いたら死ぬ。略称はTaPL。



さっそく@kisさんから推薦があった本を追記

プログラミングの基礎 (Computer Science Library)

プログラミングの基礎 (Computer Science Library)

言語がOCaml! JavaScript等から入ったのでは言語仕様に引きずられて関数型言語の本質に迫りにくいのでは?という観点からのチョイス。なのですごいH本とかNinjaに触れなくてもこの1冊を読めば事足りるのではないか疑惑。


こっちはTaPLの前に読むといいクッションになるんじゃないか、とのこと。


論理と計算のしくみ

論理と計算のしくみ

理論からはいる、と分かっているのであればこちらの本をおすすめ、とのこと。


1日経ったらかなりの推薦がきてたので追記します。

そのままOn Lispをよむとかなりの確率で死ぬので、という心優しいひとから

初めての人のためのLISP[増補改訂版]

初めての人のためのLISP[増補改訂版]

「初めての人のためのLISP」で雰囲気をつかんでおくとよいらしい。目次を紹介しているサイトがあった(http://blog.livedoor.jp/dankogai/archives/51417854.html)確かに面白そうだった。文学的な記述による解説も多そうな印象だけどプログラミング言語としてではなく論じるためには必要なのかなー。

紹介サイトには「 perl, python, ruby, JavaScript といった「モダンなスクリプト言語」が、実は構文糖衣をかぶったLISPにすぎないことを、利用者は早かれ遅かれ発見する」とまで書かれている気になる一冊

「初めての人のためのLISP」をよんだ後、以下のURLからCommon Lispについてざっくり理解して、On Lispにチャレンジが一番死ににくい登山路の様子。

Practical Common Lisp
http://www.gigamonkeys.com/book/


さらに気になるのであれば以下の本を読むといいらしい。

LET OVER LAMBDA Edition 1.0

LET OVER LAMBDA Edition 1.0

  • 作者: ダグホイト,Doug Hoyte,タイムインターメディアHOPプロジェクト
  • 出版社/メーカー: エスアイビーアクセス
  • 発売日: 2009/07
  • メディア: 単行本
  • 購入: 9人 クリック: 73回
  • この商品を含むブログ (28件) を見る
こちらの本はOn Lispの続編と称されているとのこと。


あと英語しかないものではこちらの紹介を受けました。

ジョン・バッカスチューリング賞受賞記念講演論文。
関数型言語が何故必要とされるか、についての理解の手助けとして。
"Can Programming be Liberated from the von Neumann Style?"(プログラミングはフォン・ノイマン的スタイルから解放されるか?)
http://www.stanford.edu/class/cs242/readings/backus.pdf

いっぱんに論文のような原典は初出の概念や考え方を述べるため安易な表現で丁寧に書かれてることが多いので書籍よりも信頼性が高い、という意味だと思ってます。