その3(!)、7日目の記事です。HaskellでRESTサーバを書くライブラリはいくつかあるようですが、私が気に入っているのはservantです。対抗馬としてはScottyがあると思いますが、servantはより型に安全なそうなのと、APIのあり方が好きです。servantはごく薄い機能しか提供していないので、本格的なRESTサーバに必須のDB連携を自分で書く必要があるのですが、巷にはこのサンプルが少ない気がしています。高レベルなDBアクセスフレームワークとしてはpersistentが有名だと思うのですが、servantと組み合わせた例が本家GitHubにあるにはあるのですが、persistentのバージョンが古くインターフェイスが変わっているのでコンパイルに通らなかったりするし、コネクションプーリングを使っていないので実戦的ではありません。いうわけで「一通り実戦で使えるであろう」というレベルのサンプルを作ったので紹介します。この記事内のコードで使っている主なライブラリとバージョンは以下の通りです。servant-0.11persistent-2.7.0persistent-postgresql-2.6.1全てのソースは次の場所にあります。https://github.com/jabaraster/servant-persistent-sample/tree/7b9a086fc8cbd2742bed7758fd5618a1fe2252e9まずは足回りDBに関して、接続設定取得/コネクションプール作成/マイグレーション実施の3機能です。actionここはservantと関係ないコードです。関数を使って設定値の読み込みを楽しているところ。この関数を使うとYAMLファイルから設定値を読み込めるのですが、環境変数やデフォルト値を簡単に設定できます。次はYAMLファイルの例です。"_env:PG_POOLSIZE:5"ロギングについては、上記コードでは標準出力に出力しているのですが、もっと工夫の余地があると思います。DBアクセス本体ここもservantと関係ないです。DBアクセスする関数の引数でコネクションプールを受け取るようにするのがポイントです。使えばConnectionPoolを引数から消せそうですが、まあこれはこれでアリでしょう。servantと統合いよいよservantと統合します。ConnectionPoolを受け取ってServantを返す関数を定義するのがポイントです。mkAppまとめこのコードに行き着くまでに色々調べて苦労はしたのですが、終わってみれば至極真っ当なコードになりました。今回はコネクションプールを状態として扱う必要があり、これをどう実現するかがポイントでした。関数の引数として引き回すのは素直な実装だと思います。引き回したい状態が多くなってきた場合は、関数の引数にするのは難しくなってきます。なるとState(Readerかな)をうまく使う必要が出てくると思います。いう関数で状態をまとめて取得できるようにしているようです。upLoginユーザーは見つかりませんでした。