Subscribed unsubscribe Subscribe Subscribe

HaskellでWebAppの開発に必要なN個のこと

あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずHaskellについて知っていることを書いた。 ← ここまで引用。

パッケージマネージャ

Cabal 1.18を使おう。以上。

アプリケーションサーバ

WSGIとかRackとかの流れでHaskellでもwebアプリのサーバインタフェースを統一化する動きがいくつかあった。その中で一番市民権を得たのはwaiと呼ばれるものだ。

ただ、残念なことにHaskell界でここ数年ずっと続いているI/Oストリーミングライブラリ戦争の決着がついていないため、統一化の状況は思わしくない。waiはconduitというライブラリに依存しているが、フレームワークによっては別のI/Oストリーミングライブラリを基盤にしている。

現状の3大フレームワークで次のような状況である。

  • Yesod
    • インタフェースはwai。標準的なwebサーバはwarp
    • I/Oはconduitを使う。
  • Snap
    • インタフェースは独自のものでsnap-serverを使う。
    • I/Oはio-streamsを使う。
      • 追記: I/Oはまだenumeratorを使っていて、今io-streamsに移行準備中だそうです。*1
  • Happstack
    • インタフェースは独自のものでhappstack-serverを使う。
    • happstack-waiというライブラリが有るみたいだけど動くのかは知らないし、Hackageにもあがってない。
    • I/OはlazyByteStringを使っているみたい。将来はpipesに移行するらしい。

要するにほとんど統一化されておらず、各々が好きなインタフェースを実装して使っていると考えてよい。個人的にはこの状況はもうしばらくの間、続くのではないかと思っている。

リクエストパラメータの処理・ルーティング

基本的にフレームワークについてくるものを使う。

データベース

Yesodやwai陣営は基本的にpersitentSQL方面で拡張したesqueletoを使う。

Snapではフレームワーク自体にはデータベースアクセスのサポートはないが、アドオン(snaplet)の形式でいくつかサポートされているようで、persistentを使うこともできるらしい。

HappstackはなんとRDBMSではなくてacid-stateを押しているので、フレームワークとしてのサポートは特にないのではないかと想像できる。

いずれのフレームワークを使っていても、もっとローレベルなライブラリを直接叩く人もいるのではないかと思う。

ビューのレンダリング

たいていのケースでフレームワークに付属しているものを使う。MustacheのHaskell実装であるhustacheを使う人もいるかもしれない。

HTTPクライアント

Haskell PlatformにHTTPパッケージが入っているけどAPIがひどいので使っている人は少なそうな印象。

この分野もI/Oストリーミングライブラリの影響を多分に受けるのでフレームワークによっておすすめが変わると思う。

あたりがメジャーどころ。

テストフレームワーク

QuickCheckとHUnitを書くことになるが、それを補助するライブラリがいくつかある。

前2つはQuickCheckテストをまとめてくれるもの。並列実行などもサポートしている。

hspecはrspecみたいな感じにテストを書けるらしいけど使ったことがない。

doctestはテストをコメントとして書くことで、ドキュメントにもなるというもの。

hspecとdoctestはHaskellの単体テスト最前線 - あどけない話を参照されたい。

Webアプリケーションフレームワーク

上に出てきたとおり。YesodとSnap、Happstackが三強。

比較はWeb/Comparison of Happstack, Snap and Yesod - HaskellWikiにまとまっているみたい。

とりあえずフォーマットは埋めたので、思いつきベースで追記するかもしれない。何か言いたいことがある人は追記するのでコメントで教えて欲しい。

*1:fujimuraさん、ありがとうございます。