関数型プログラミングに関わる本の書評
この記事はShinosaka.rb Advent Calendar 2016の19日目の記事です。
持っている本一覧
このACではrubyに限らず、どのような記事でも良いらしいので、現在僕が持っている関数型プログラミングに関係する(と思う)本の書評を書いてみようと思います。
現在持っている関数型絡みの本は
- すごいHaskellたのしく学ぼう!
- Real World Haskell
- ふつうのHaskellプログラミング
- 関数プログラミング入門
- プログラミングElixir
- エーフィーのアトリエ - アランビックの錬金術師
- エーフィーのアトリエ Plus - アランビックの錬金術師
- Scalaスケーラブルプログラミング(第2版)
- 簡約!?λカ娘 始まりの総集編
以上9冊です。
並べてみると意外と少なかったです。
現在読んでいる本は『簡約!?λカ娘 始まりの総集編』と、学校で借りた「関数型プログラミングの基礎 JavaScriptを使って学ぶ」です。
学校で借りて読んだ本は「Haskellによる並列・並行プログラミング」、立ち読みしただけなら某IQ145本もあります。
書評
すごいHaskellたのしく学ぼう!
- 作者: Miran Lipovača,田中英行,村主崇行
- 出版社/メーカー: オーム社
- 発売日: 2012/05/23
- メディア: 単行本(ソフトカバー)
- 購入: 25人 クリック: 580回
- この商品を含むブログ (71件) を見る
現時点、日本語でHaskellを入門するならば第一選択です。
「Haskellをやってみたい」という声が聞こえてくるとどこからともなくこの本のリンクを投げつけます。
内容はHaskellの言語仕様やHaskellで使われる概念を順番に説明していくというものです。特にファンクター、アプリカティブファンクター、モナドの説明が具体的で良いです。
ネット上であればファンクターを理解する助けになる記事はいくつかあるのですが、ファンクターのイメージををうまく説明している本はこの本ぐらいだと思います。
この本を読めば、関数の定義の仕方、型の宣言の仕方、パターンマッチ、再帰、高階関数、モジュール、型クラス、入出力の基本、ファンクター、アプリカティブファンクター、モナドの辺りが分かると思います。
Haskellを始めたいならとりあえずこの本を買えばいいと思うよ!
ここだけの話、関数型界隈では「すごいH本」という愛称で呼ばれています。エッチな本。
Real World Haskell
Real World Haskell―実戦で学ぶ関数型言語プログラミング
- 作者: Bryan O'Sullivan,John Goerzen,Don Stewart,山下伸夫,伊東勝利,株式会社タイムインターメディア
- 出版社/メーカー: オライリージャパン
- 発売日: 2009/10/26
- メディア: 大型本
- 購入: 8人 クリック: 245回
- この商品を含むブログ (76件) を見る
すごいHaskellたのしく学ぼう!の後にに読むべき本だと思います。中級者向け。
特筆すべき点はその分量の多さです。なんと720ページあります。鈍器です。
実践的なコードの書き方を学ぶことができます。
すごいHaskellたのしく学ぼう!では扱っていなかったモナドトランスフォーマーや正規表現やSTM、更にはParsecの使い方やデータベースの使い方(この内容は既に古くなっているかも)、果てはバーコード認識なんかも扱います。盛りだくさんです。
ところどころ内容が古くなっていて、そのまま使うのは難しい部分がありますが、現状ここまで多くのことを扱っているHaskellの日本語の本はないので更なるステップアップを望むのであれば読んで損はないと思います。
Haskellによる並列・並行プログラミング
- 作者: Simon Marlow,山下伸夫,山本和彦,田中英行
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/08/21
- メディア: 大型本
- この商品を含むブログ (2件) を見る
この本は図書館から借りて読んだので手元にはないのですが、一応読んだ本なので紹介します。
関数型言語の触れ込みとして「並列化が得意」と言われることがありますが、その真髄を見ることができる本だと思います。
プログラミングで一般的には難しいとされる並列・並行化ですが、Haskellでは強力な抽象化能力と強力な型システムによって比較的楽に並列・並行化を行うことができます。
モナドによる抽象化は並列・並行処理でも存分に使われており、モナドの偉大さが感じられます。Evalモナド、Parモナド、STMモナド辺り。モナドなので小さな並行処理同士を組み合わせて大きな並行処理を組み立てることができます。
Evalモナドを使った並行化では、複数の式を並行に評価することで並行化を行います。
ParモナドはParallelモナドの略で名前の通り並列化を行うのですが、例えばリストのmapを並列化したりします。
STMというのはSoftware Transactional Memoryの略で、これを使うとロックフリーに並行処理を行うことができます。
この本ではEvalモナド、Parモナド、STMモナド以外にもGPUプログラミング、スレッディング、分散プログラミングも学ぶことができます。
ふつうのHaskellプログラミング
ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
- 作者: 青木峰郎,山下伸夫
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2014/10/05
- メディア: オンデマンド (ペーパーバック)
- この商品を含むブログを見る
「すでに他のプログラミング言語を知っている人がサラッとHaskellの概要を覗くための本」と言ったところでしょうか。内容は「すごいHaskellたのしく学ぼう!」よりも少ないです。
基本的な言語仕様、モナドの概要を知るためであればこの本が向いていると思います。しっかりHaskellを知りたいのであれば、「すごいHaskellたのしく学ぼう!」をお勧めします。
終盤の実践的なプログラムの部分ではパーサーの作り方を知ることができるのでその点は良かったと思います。
関数プログラミング入門 ―Haskellで学ぶ原理と技法―
- 作者: Richard Bird,山下伸夫
- 出版社/メーカー: オーム社
- 発売日: 2012/10/26
- メディア: 単行本(ソフトカバー)
- 購入: 3人 クリック: 28回
- この商品を含むブログ (5件) を見る
普通に証明が出てくるような本です。Haskellにおけるデータや関数の性質を確かめるために証明をします。ちょっとレベルが高いかも。僕は十分に理解はしていません。そのうち読み直したいです。
プログラミングElixir
- 作者: Dave Thomas,笹田耕一,鳥井雪
- 出版社/メーカー: オーム社
- 発売日: 2016/08/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
現在、一般的な書店で手に入る唯一の日本語のElixir本です。
言語仕様から始まり、Elixir(Erlang)の売りであるアクターモデルの扱いを中心に説明した本です。
説明は分かりやすいと思います。アクターモデルを全く知らなかった僕ですが、この本を読んでなんとなくアクターモデルのイメージを持つことができるようになりました。
Erlangは耐障害性に重点を置いた言語で、ErlangVMの上で動くElixirもその利点を享受しています。
K10C問題やWebSocketで並行性能が注目されるようになり、ErlangVMのプロセス管理の上手さがにわかに注目を浴びましたが、Erlangの言語仕様はPrologライクでパッと見のイメージで敬遠されがちです。ElixirはRubyライクな言語仕様と極力なマクロとPhoenixというRuby on Railsインスパイアのウェブフレームワークを引っさげて登場しました。シンプルな関数型プログラミングが好きなRailsプログラマにお勧めな言語です。
エーフィーのアトリエ - アランビックの錬金術師
Elixirの同人誌です。
内容はRails TutorialのElixir/Phoenix版と言ったところでしょうか。Ruby/RailsプログラマがPhoenixを習得する最短の方法はこの本を読むことだと思っています。
エーフィーのアトリエ Plus - アランビックの錬金術師
上記の本の続編です。
内容は大きく分けてE2Eテストの方法と、Ectoの使い方です。
Scalaスケーラブルプログラミング(第2版)
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレスジャパン
- 発売日: 2011/09/27
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 235回
- この商品を含むブログ (46件) を見る
- 作者: Martin Odersky,Lex Spoon,Bill Venners,羽生田栄一,水島宏太,長尾高弘
- 出版社/メーカー: インプレス
- 発売日: 2016/09/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
いわゆる「コップ本」。
現在、第3版が出ているので今から買うのであればそちらを買った方が良いと思います。
Real World Haskellを超えるページ数を誇り、第2版の時点で744ページ、第3版は752ページあります。こちらも立派な鈍器です。
重厚な言語仕様を持つScalaをしっかりと満遍なく説明した本であり、この本を読めばScalaの基本は十分押さえたと言えるでしょう。
関数型プログラミングでよく使う、ケースクラスと型パラメータをしっかり説明してくれたのは個人的に嬉しかったです。コレクションのAPIを詳しく説明されていたのも好印象です。
ところでScalaはなぜXMLリテラルを採用したのか謎です。XMLを扱うことが最近少なくなってきていると思うのですが、Scala開発当初はそこまでXMLが流行っていたのでしょうか?
関数型プログラミングの基礎 JavaScriptを使って学ぶ
関数型プログラミングの基礎 JavaScriptを使って学ぶ
- 作者: 立川察理,長瀬嘉秀
- 出版社/メーカー: リックテレコム
- 発売日: 2016/10/29
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
まだ読書中なので書評を書くのは憚られるのですが、パラパラと見た限りでは扱っている内容が非常に良いです。
[詳しくは読んでから書きます]
出てくるコードは基本的にJavascriptで、「Haskell怖い」という方にも良いかもしれません。
簡約!? λカ娘 - 始まりの総集編
[読んだら書きます]
2016年12月現在、とらのあなでは売り切れており、ネット上では中古も流れていないようなので入手するのは難しいと思います。僕は運良くtwitter上で譲って頂きました。
終わりに
10冊の書評を書きましたが結構時間がかかりました。3時間ぐらい?
公式のドキュメントは英語のことが多く、ネット上にはまとまったまとまった情報が少なく、「すばやく言語を勉強したい」という時は本を読むのがベストだと思います。
特に右も左も分からない時にはまとまった情報があると非常に学習効率が良いでしょう。公式ドキュメント以外のネットの情報は最新のものや細かいものが手に入る一方、体系立った情報は手に入りにくいですし。