軽量言語のお手軽なWebプログラミングをHaskellで : Implicit Parameter を使って (未完)
与太話。
Haskell でもお手軽にWebアプリ書きたいんですが、 どうせならいま流行の軽量な感じに書けたら嬉しいのです。そしたら皆にも使ってもらえるよね。 型がうれしいHaskellで軽量にWebアプリが書けたらもう向かう所敵なしだと思う。
アイデア: リクエストパラメータ=Implicit Parameter
Webアプリのリクエストパラメータとは、たとえば URL http://hogehoge/...?a=10&b=20 でいう ? 以降のことですが、これを Java Servlet だと Integer.parseInt(request.getParameter("a")) みたいなやり方で取得しなければならず、すこぶるめんどくさいのです。プログラミング言語の変数みたいにリクエストパラメータにアクセスできればハッピーだと思います。すくなくともPHPとかPerlはそんな感じだったと思います。
じゃ、いかに軽量にリクエストパラメータをHaskellの変数にマップするか?かつ、既存のHaskellの枠組み(つまり型システム)ときれいに整合したやり方で? で、考えたのが、 implicit parameter(暗黙パラメタ)をリクエストパラメータとして扱うこと。Implicit ParameterはHaskellでグローバル変数のようにどこでも変数をいきなり使うことができる仕組みです。implicit parameterの使用は型シグネチャに現れます。
何言ってるのかわからねーと思うが(ry、私の妄想ではこんな風にプログラムを書きます:
module Calculator where adder = "<div>a + b =" ++ show (?a + ?b) ++ "</div>"
ここで ?a や ?b は 関数adderの implicit parameterで、そのままリクエストパラメータにアクセスできます。たとえば ?a=10&b=20 なら aには10, bには20が入ります。
ちなみに adderの型は
b :: (?a::Int,?b::Int) => String
となります。
このページには、 http://server/Calculator/adder?a=10&b=20 のようにアクセスします。 すると <div>a + b = 30</div> が返ってきます。
Convention over Configuration のように、ややこしい設定ファイル抜きで、 URLの /Calculator/adder がそのまま Calculator モジュールの adder 関数に対応づけることができます。
他のアイデアと課題
そんなに大した話ではないのですが
- Maybe 型になっているパラメータは省略可能
- リスト型のパラメータは複数選択のパラメータに
- 入力値の検証はどうするか
- どうやってフォームを型付けするか
- セッションパラメータとリクエストパラメータは
とりあえず実装
Haskellには template haskellというリフレクションの機能がありますが まともに implicit parameter を扱えないので Haskell のパーサー haskell-src-exts と GHC API のお手軽インタフェースhint(に手をいれたもの)を使います。
すなわち、
- HTTPリクエストをパースして、モジュール名、関数名、リクエストパラメータに分解
- モジュールと関数を hintで読み込む
- 関数の型を抽出。 型には implicit parameterが含まれる
- implicit parameter の名前と型に従って リクエストパラメータをパース
- 4. でパースした implicit parameter で 2. の関数を呼び出し、ブラウザに結果を返す
というステップです。