Practical OCaml : 絶対買うな

Practical OCaml を手に入れた。ただで。買おうとしたらやるから買うなと言われて一年。持ってこいといっても誰も持ってこなかったので、取りに行った。こりゃ内容のわりに重いから誰も持ってこないワケだ。

この本について書くこと自体全く持って時間の無駄なのだが、どうやら Practical OCaml を買って OCaml を勉強しようとしている人達がいるらしい。正直それはあまりに不幸なので、注意を喚起するべくここに書評のようなものを書いておく。

Practical OCaml

Practical OCaml

Practical Common Lisp が名著(だそうだ)なだけに大変残念な結果です。

まず結論から

簡単だ:

この本を買う位なら Haskell とか Scala とか Ruby とか、何でもいいけど他の言語の本を買ってその言語を勉強していただいたほうがお互いのためです。さようなら。

この本を買って読んでも OCaml が好きになるとは思えないし、OCaml をマスターできるはずもない。どうせ OCaml ユーザーになれないのなら他のすぐれた言語のユーザーになっていただいた方がマシである。つーか、5000円もこのゴミに出す位なら100円バーガー50個一気に食べるほうがまだましであろう。既に間違って買ってしまった人は残念無念。

Amazon のレビューから

まー、いつも放言している私の言うことなどアテにならないかもしれないから、まず、Amazon のレビューの★1つのとこを読んでもらいたい。どう酷いか、一般的な所は判ってもらえると思う。この内のいくつかの名前には私は見覚えがあるからどうやら身内のようだ。彼らは私同様に OCaml 使って飯を食っているのでコメントは十分信頼できる。次のコメントは彼らの物もあるし、そうでないのもある:

This is a bad book. It's unfortunate, too, because it was a great idea. The book contains many errors, from typos to grammatical errors to code indentation issues to problems which demonstrate a complete misunderstanding of the subject matter. As a professional OCaml programmer, it is clear to me that this was not written by somebody who understands the subject.

その通り。まだ行儀の良い意見。

The writing style is surprisingly bad, considering the author has a degree in English and this book had a professional editor. Much of the book looks like a bad cut & paste job. The author often describes a concept in very general terms, dumps a dozen lines of code and moves on without ever explaining what the code is doing (strange for a programming language book).

日本人が読んでも文章としておかしいところが山の様にある。

The book is poorly written, disorganized and jumps around kind of like the author is on crack or something. I got about 2 chapters in and couldn't even go further.

著者はヤクでもやってたのか、というコメント。まあ、そう思いたくもなる。

どこがどう悪いのか

これが答えられないのだ。これが、じゃあ実はそんな悪くないんじゃん、とか思う人が出てくる原因なのかもしれないのだが、、、なぜ答えられないかというと、

至る所悪い

としか言いようがない。一々あげつらうほど暇じゃないのである。なので、結論として一言、読むな、買うな、ということになるのだが、これをヒステリー反応だと思う人がいるかもしれない。
この本を買ってしまった人は、取り合えず、どっかのページを開けたらツッコミどころが必ずある、と言っていた。そんなアホな、と思ってだな、、、

46, 47 ページを開いてみた

以下引用はすべて Practical OCaml から。

Doing More Pattern Matching

Although your functions do not have to do pattern matching, it is a powerful tool and is used widely within the world of OCaml code. So far, you have done pattern matching only on types, but you can pattern match on values as well.

  • let f x = や fun x -> という関数定義にもパターンは使われているので、OCaml を知っていればこんな文章は書かない。
  • 型によるパターンマッチとは何なのか、そんな物があるとすれば、是非教えていただきたい。少なくとも普通の OCaml にそんな概念はない。筆者が勝手に名前を付けた既存の概念だと思われるが、何か知りたくもない。おそらく解説さえされていないだろう。
  • Doing More とあるから、じゃあ Pattern Matching の解説が前にあるかと思えば、ある(31ページ)。しかし、

Pattern matching is very powerful tool. Using a distance type similar to the one you defined earlier, you can write a function to convert between feet and meters:
何かコード例

「パターンマッチは強力です。例えば、前の例を使って次の様にフィートとメートルを変換する事ができます。」と言い放ち、例がポンとあるだけ。これだけである。パターンマッチとは何か、全く説明が無い。少なくともパターンマッチの節ではそれだけである。パターンマッチは ML 系言語のもっとも強力な機能の一つで、他の多くの言語には備わっていない概念だ。それをこれだけの解説(にさえなっていない)で済ませているのは、パターンマッチが筆者に取って常識だからではなく、説明できないからとしか思えない。

default match

Default match と称してワイルドカード _ を使った例を解説しているが、_ がその default match である事はどこにも書かれていない。ちなみに、_ について解説しているのは遠く124ページである。この本はこんなのばっかりで、全体が let rec による相互再帰で定義された内容になっている。これは、当然、教科書としては最悪だ。

Polymorphism を理解していない

... if you want to define a polymorphic function that is similar to the previous one but takes three integers, ...

といって、int * int * int -> int という型の関数をイジクリ始めるのだが、どこをどうすれば多層型関数になるというのか。

... if you want the third argument to be polymorphic, you have to use type constraints or not operate on that argument with type-specific operations.

後半は正しいが、それはもはや、int * int * 'a -> int という型で、三つの整数を取る関数ではない。さらに酷いのは前半。全くの大嘘。型制限は polymorphic な物を less polymorphic にすることは出きるが、その逆は逆立ちしても出きるはずはない。当然のごとく、後半の例は出てくるが、前半の型制限を使った例は出てこない。出てきてもらっても困るが。

一事が万事この調子。解説し出すと元の本の数倍の紙が必要になる。

ほんとーに Richard Jones が Technical Review したのかよ。鯉の写真以前にこっち何とかしろよ。

インデントがおかしい

筆者にうまい解説が出来ない所は必ずと言っていいほど冗長なコード例を提示することで逃げているのだが、このコード例のインデントが(他にもおかしいとこいろいろあるけど、略)致命的におかしい: 125ページ

# Setofexceptions.iter (fun x -> match x with
                                       Not_found -> Printf.printf "Not Found, eh?\n"
                                       | Failure m -> Printf.printf "Failed: %s\n" m
                                                | _ -> raise x) soe;;

なんか頭に沸いてるんですか?というインデント。普通の神経なら、

# Setofexceptions.iter (function
    | Not_found -> Printf.printf "Not Found, eh?\n"
    | Failure m -> Printf.printf "Failed: %s\n" m
    | _ -> raise x) soe;;

と書く。恐ろしいことに、上のインデントは何か筆者なりの思想があるらしく、本書全体で一貫している、様に見えて、時々まともなのもある。頭が痛い。どうやら OCaml の文化を知らないようだ。(文化は押し付けたり、押し付けられたりする物ではないと思うが、ここまで無理解で本を書いてしまう、というのはあっぱれ。)

所で、function keyword を索引で引くと、object の解説の所に飛ばされ、 function については既知の概念となっている。function がどこで解説されているのか、それともされていないのか、確かめるには人生は短すぎる。

個人的にイラッと来た所

111ページ

Labeled Variants

..., if a feature is labeled Do Not Use, it is probably best to not use it. ... Trust me.

Labeled Variants ってのは筆者の用語で、label 付き引数を使った標準ライブラリモジュールの事。使うなと言いきっているが、文章からするに何の役にたっているのか理解していないのは明らか。Trust me って言われても。ここだけでも噴飯物である。(これは俺の過去と関係のある話なので、まぁちょっと感情的だ)

結論

買うな。それでも買う人は、さようなら。

追記

なんだ結局こういう内容が受けるのかww
Rich のブログは内容は素晴らしいので皆さん読むように。ただ、ブラウザで開けるといつもビックリするよね。

この本については日本語での私よりまともな批評が既にいくつかある。(2ch にリンクを載せてくれたひとありがとう。わざわざ調べてもみなかった。) そちらも併せて読んでください。