haskell - このHappstackフォームコードの一部をリファクタリングする方法はありますか?

haskell happstack

私はGETとPOSTをHappstackチュートリアルから1つのハンドラー関数に入れようとしているので、常に一緒になっています。

login :: ServerPart Response
login = msum [ 
    do methodM POST
       user <- look "user"
       pass <- look "pass"
       success <- query $ CheckPassword user pass
       ok $ toResponse (user ++ ", " ++ pass ++ ": " ++ (if success then "Valid" else "Invalid")),
    ok $ toResponse $ html $ do
      B.head $ do
        title "Login Form"
      B.body $ do
        form ! enctype "multipart/form-data" ! B.method "POST" $ do
             B.label "user: " >> input ! type_ "text" ! name "user" ! size "10"
             B.label "pass: " >> input ! type_ "text" ! name "pass" ! size "10"
             input ! type_ "submit" ! name "upload"]


変更したいことは次のとおりです。


フォールスルーであるだけでなく、明示的にmethodM GETを呼び出します。
冗長なok $ toResponseを引き出して、1か所だけにしてください。
できれば、POSTがHTMLも返すようにします。
その他の、経験のある人には「オフ」に見えるもの。何か案は?


更新:#1を把握しました。 do methodM GETの上にok $ toResponse $ ...を追加しても問題はありませんが、私のような初心者にとって注意すべき点は、縦に並んでいる必要があることです。つまり、methodMのmはokのoの真上にある必要があります。うまくいけば、これは誰かのフラストレーションの時間を節約できます。

更新2:#3はかなり簡単でした-POSTの最後の行をok $ toResponse $ html $ do B.body $ toHtml $ user ++ ...に更新するだけです
答え
フォームレット(Happstackで動作します)および/または消化機能(SnapおよびおそらくHappstackでも動作します)を検索します。

http://hackage.haskell.org/package/formlets

http://hackage.haskell.org/package/digestive-functors

消化ファンクターがフォームレットよりも優れているかどうかは調べていませんが、新しいパッケージであり、古いパッケージよりもシンプルな場合があります。

examplesあります

F#には、JavaScriptにコンパイルされ、クライアント側で同様のことを行うライブラリさえあります。それは、JSからのログインの可用性のようなものをチェックすることができますが、それでも素晴らしいformlet / functionalスタイルで書かれています。これはWebSharperと呼ばれています。
WebSharper
関連記事

performance - collat​​zチェーンのパフォーマンスの問題

haskell - 独自のデータ型をモナド関数チェーンの戻り値として定義する方法は?

haskell - 型クラスによる関数型シグネチャのクリーンアップ

haskell - Haskellの可変ヒープ構造

haskell - Yesodがインストールに失敗する(つまり、テキストパッケージ)

haskell - wxHaskellのラベルが全文を表示できない

haskell - Haskellでのリストの結合

string - Haskellのグリッドからローカルスクエアを返す

haskell - ネットワークパッケージをインストールできません

performance - 素数フィルタの2つの実装のパフォーマンス比較