7

私はウェブアプリっぽいサービスを開発することでHaskellにもっと慣れようとしています。

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

私は自分のGoogle検索でこの議論に出くわしました。提案された解決策は、すべきでないことの良い例のように見えます。

私が持っていたアイデアの1つは、リクエストハンドラーにMVarを取り込むことでした。

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

ハンドラーを登録するとき、メインで作成されたMVarでカレーすることができます。

より良い方法があるに違いありません。機能しない方法でこの問題に取り組んでいると思わずにはいられません。

ありがとう!

4

2 に答える 2

4

あなたはおそらくAcid-stateが欲しいでしょう。それは正確にそれを与えます: Haskell データ型の永続的な状態。私がリンクしたドキュメントは、あなたが求めたように、リクエストカウンターから始まります.

MVar は永続的ではないことに注意してください。サーバーが再起動されると、カウンターはリセットされます。それが実際に必要な動作である場合は、代わりにTVarを使用することをお勧めします。そうすれば、ロックやロックに伴うデッドロックのリスクなしに、カウンターをアトミックに更新できます。

于 2013-01-26T16:10:14.787 に答える
1

永続性と TVar が好きな場合は、TVarと同じセマンティクスと同じ使用パターンを持つDBRefを使用できます。状態の一意のキーを定義する必要があり、ファイルの自動永続性があります。データベースの永続性のために、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)
于 2013-04-27T10:30:51.710 に答える