2013-01-25 6 views
7

私はHaskellにもっと慣れ親しんで、Web-app-ishサービスを開発しようとしています。Haskell Webserver:アプリケーションの状態を維持する

私はWebサーバーを開発しており、リクエスト間で永続的な状態を維持したいとします。例えば、カウンタ。ハスケルのやり方は何ですか?

Google検索でdiscussionが見つかりました。提案された解決策は、何をしないかの良い例のように見えます。私は要求ハンドラがMVARに取る持っていたていた

一つのアイデア:

requestHandler :: MVar State -> IO (Maybe Response) 

ハンドラを登録するとき、それはMVARでカリー化することができ、メインで作成されました。

もっと良い方法が必要です。私は助けることはできませんが、私はこの問題に機能しない方法で近づいていると思います。

ありがとうございます!

+0

なぜサーバー自体に永続的な状態を運ぶためにしてみてください。

状態は、各セッションのためのユニークなカウンターを持っているのだろうか?私にとって、HaskellはRESTfulなデザインとよりよくマッチするでしょう。 –

+1

そのアプローチについて「機能していない」とは何ですか?あなたは共有する必要があるいくつかの状態を持っているので、それを包んで参照を渡します。私にとってはかなり簡単です。 – sclv

+0

sclv:FRPのアプローチがもっとあるのだろうかと思います。 – David

答えて

4

おそらくacid-stateが必要です。これは正確には、Haskellデータ型の永続状態です。私がリンクしたドキュメントは、あなたが求めているのと同じように、リクエストカウンターから始まります。

MVarsは永続的ではありません。サーバーが再起動されると、カウンターはリセットされます。それが実際にあなたが望む振る舞いであれば、代わりにTVarを使用することをお勧めします。そうすることで、ロックやそれに伴うデッドロックのリスクなしに、カウンターを原子的に更新することができます。

1

持続性とTVarsが好きなら、TVarと同じセマンティクスと同じ使用パターンを持つDBRefsを使用できます。状態の一意のキーを定義する必要があり、自動ファイル永続性があります。データベースの永続性を確保するには、IResourceインスタンスを定義する必要があります。

import Data.Map as M 
import Data.TCache 
import Data.TCache.DefaultPersistence 

type Counter= Int 
type SessionId :: String 
data State= State SessionId Counter deriving (Read, Show, Typeable) 

instance Indexable State where 
     key (State k _)= k 

requestHandler :: Request -> DBRef State -> IO (Maybe Response) 
関連する問題