以前clojureで作成した自分用WebアプリをHaskell(GHC)で作ってみている。感じた点を並べてみる。

言語としての違い

ソースの単純な見た目としてはclojureの方が自分好み。Haskellの方は"$, ->, ., <-, !"といった記号が乱発され、とにかく読む気が失せる。しかも一目見ただけでは関数の適用順さえ理解しにくい。Lispライクな文法にしなかったのはHaskellの一番いけてない点だと主張したい。

case all of
[] -> res
(x:rs) -> case Data.Map.lookup (qname x) res of
Nothing -> formatByKamoku' rs $ insert (qname x) ((V.replicate 12 0) V.// [((month x)-1, cost x)]) res
Just v -> formatByKamoku' rs $ insert (qname x) (v V.// [((month x)-1, cost x)]) res

みたいなコード。後から読みたいと思えない...。

久しぶりにMLスタイルの関数型言語でプログラミングをしたが、確かにへぼプログラムミスは型で検出できるので、clojureより多少楽なように感じた。型注釈をしないといけない場面もあったりするので、静的型は善し悪しではある。

また、それなりにプログラムを作るとなると、モナドを使わない訳にはいかないので、そこも取っつきにくいところではある。これはしばらくやっているうちに(使うだけなら)感触が得られたが。

ライブラリの充実

clojureが一歩リードという感じ。さすがにJava資産が使えるだけある。これ以上の充実は(あったとしても).NET以外にはあり得ないのでは無かろうか。leinコマンドで必要なライブラリが簡単に取得できるのも最高に楽ちん。

Haskellは、ライブラリの使用感はclojureに少し劣るとはいえ、こちらもcabalコマンドで大体自動的にインストールできるので、それほど大変ではない。"大体"というのは、ライブラリによってはネイティブプラットフォームのライブラリが必要な場合もあるため。これが原因でインストールが失敗した場合は、apt-getなりbrewなりportなりでインストールすれば解決する。

HTMLテンプレートのライブラリについて言えば、clojureではfleet, Haskellではblaze-htmlを使った。個人的にはfleetのように、HTMLはできるだけ崩さず、そこに必要なコードを埋め込むほうが好み。ただ、blaze-htmlを使ってみて、tableをプログラムで生成するような場合についてはblaze-html方式のほうが読みやすいと感じた。というわけでどちらも一長一短。

開発環境

Emacsでの開発環境構築という点ではHaskellの方が楽に感じた。clojureはSlimeがうまく設定できていないので、eshellを起動してlein replとして対話開発をしている。これでもそれほど困るという訳ではないが...。他の開発環境(Eclipseなど)については調査していないので不明。

実行速度

まだ正確なパフォーマンスを測定したわけではないが、Apache Benchで負荷を掛けてみると、Haskellの方が数倍速く動作している様子。リクエストに対する応答速度がHaskellの方が一定している。メモリ使用量もHaskellの方が優れている。これは本気でWebサービスを開発するのであればHaskellも検討に値しそうである。これだけいまいちな文法であれば、スピードくらい出ないと使う意義を見出しにくいが。オタク言語の面目躍如といったところであろう。

最後に

さんざん文句を言ったが、Haskellはそう悪くはないという感触。慣れればそれなりに楽にコードが記述できる。スピードも速いので、これからはもっとHaskellを使うようになるかも知れない。Javaの将来がまだ少し不安でもあり、またJava自体のバグに苦しめられることもないので、ネイティブコードを吐けるHaskellは有利でもある。Webサービスに使うのであれば、Linuxでコードが動けば十分であろうし...。

Comments