Haskellの開発ツール (2011年版)

Haskell開発に関係するツールをとりとめもなく列挙してみます。

エディタ/IDE

僕は、Emacs と haskell-mode と ghc-mod を組み合わせて使っています。haskell-mode は、行頭揃えの機能がしょぼいので、作り直したいと思っています。

IDE のバックエンドとしては、scionがありますが、使ったことがないので説明できません。(僕は ghc-mod で十分だと思っているので。)

Leksah とか yi とかも聞きますが、使ったことがないので知りません。(いや、yi はちょっと使ったことがありますけど。) 興味のある人は自分で調べて下さい。

マニュアル

関数のマニュアルが読みたくなったら、GHCについてくるモジュールの一覧とhackageDBから探して下さい。ghc-mod を使っていれば、一発でブラウザに表示できます。

探すのが面倒なら、google に適切なキーワードを入れれば、おそらく求めているマニュアルが見つかります。Hoogle や Hayoo!にお伺いをたてるのもいいでしょう。

自分でパッケージを作る場合、マニュアルはコメントに Haddock 形式で記述します。

パッケージ管理

公開するパッケージは Cabal 形式にして、hackageDB に登録します。

hackageDB に登録されたパッケージは、Haskell Platform に付いてくる cabal コマンドで依存パッケージも一括でインストールできます。しかし、アンインストール(ライブラリファイル自体は残るが登録は抹消される)には ghc-pkg というコマンドを使わなければならず、統一感がありません。また、cabal コマンド自体も、とっても不便です。

そこで、cab というコマンドを公開しています。

% cabal update
% cabal install cab

を実行した後は、cabal や ghc-pkg のことは忘れて、cab だけ使えばいいようになっています。

デバッグ

printf デバッグには、Debug.Trace モジュールの trace を使います(参照透明が壊れるって? よく気付きましたね。背に腹は代えられないのです)。第一引数の String には(他の区別が付くような)適当な文字列を与え、表示したい値を第に引数に指定します。つまり、変数 foo を使っている場所で、foo の値を表示したければ、(trace "foo" foo) に置き換えればいいのです。(ああ、アスペクト指向でないところがダサい。)

Haskell は、どこもかしこも参照透明なので、一部を切り出して、トップレベルの関数にしてもちゃんと動きます。こうなれば、ghci で対話的にテストできます。また、関数以外のデータリテラルが強力ですから、テストデータも簡単に生成できます。data を deriving Show しておいて、適切なところで trace すれば、入力可能なテストデータが得られます。こんなデバッグができる言語は、他にはあまりないでしょう。

ghci にはデバッガが付属しています。例外がどこから来たのか調べるのには便利です。

テスト・フレームワーク

世間では、テストケースを手で書いて、それを一括で実行する仕組みを作ることをテストの自動化と呼びます。

一方、Haskell コミュニティでは、プログラムの性質を記述し、テストケースを自動生成することも、テストの自動化に含めています。これを実現するパッケージが QuickCheck で、Haskell Platform に付いてきます。

理想的には QuickCheck だけで済ませられればいいのですが、IO が絡むとそうはいきません。その場合は、JUnit に似た HUnit を使います。

これらを統合的に扱えるフレームワークが、test-frameworkです。型推論を欺くバグは、test-framework を使って一掃しましょう。

プロファイラー

GHC 自体にプロファイルを取る機能があります。詳しくは Real World Haskell を読んで下さい。

ベンチマーク

遅延評価のプログラムに対して正しくベンチマークを取ることは、とても困難です。必ずcriterionを使いましょう。criterion を正しく実行するためには、deepseqも深く理解する必要があります。

バージョンごとに速くなっているのか確かめたかったら、criterion を利用する progressionがお勧めです。

バージョン管理

素直に git を使いましょう。