あなたがHaskellを使った方が良いただ一つの理由
あなたの思考が穴だらけだからである。
その穴だらけの思考を具現化して何になるというのだ。
遊びならいいが仕事では駄目だ。デバッグに手間がかかりすぎる。
では何故Haskellか?
Haskellは包括的な記述をあなたに要請するからである。
以下はHaskellのif式だ。式なのでそれ自身値を持つ。
if n > 3 then "n is bigger than 3" else "otherwise"
Haskellでのif式ではelse以降を省略することが出来ない。
使いづらいと思うだろうか。しかしifをネストし、else以降を書かなかった部分があったために致命的なバグを生んでしまったことはないだろうか。そのバグは見つけづらい。それはそうだ。コンパイルでは見つからず、あなたの思考には穴があるために何度読んでも正しいとしか思えないからだ。
賢明であれば、その前後で使用している変数の値を追いかけてバグを探すだろう。
しかしHaskellであれば、そのようなバグはそもそも生まれない。
Haskellは包括的だからだ。すべてのパターンを記述する事を要請するからだ。
Haskellにはnull相当の欠損値がない。欠損値が欲しければMaybeを用いる。
case value of (Just n) | n > 0 -> "Positive!" | n = 0 -> "Zero!" | otherwise -> "Negative!" Nothing -> "Nothing!"
Nothingが欠損値であり、Maybe x型の値である。言語的に特別な値というわけではない。
Nothingが言語的に特別な値でないことが重要だ。
あなたが(Maybe x)型を考えるとき、(Just x)とNothingのたった2パターンだけ考えれば、それですべてを考慮したことになる。
多くの言語で特別に作られたnullだかundefinedだかnilだか知らないがそいつらのせいで一体いくつバグが生まれたのだろう*1。もしHaskellにそのような言語的に特別な値Nullがあったならば、あなたはMaybe xを考えるときにJust xとNothingとNullの3パターンを考慮しなければならなくなる。特別な値が多ければそれだけ考えるパターンは増える。もちろんMaybe xだけでなく、IntやCharをはじめとした、すべての型についてだ。
Haskellは包括的に書くことができる。あなたの思考に穴があろうとも、その穴をきちんと埋めてくれるのだ。
何故、テストの重要性が叫ばれているのか?
それは包括的に書くことが困難だからである。
テストとは、思考にどうしても存在してしまう穴を、実験的に埋める作業だ。そこには少なからず作業が伴う。そして完全というわけではない。
Haskellは優秀なテストツールがあるだけでなく、あなたのコードに開く穴を出来る限り閉じてくれる。そしてそれは実験的なものではなく、強固な型システムによってきちんと保証してくれるのだ。