wai
/warp
のState
モナドに状態を格納するWebサーバーを作成したいとします。このような何か:Warp/WAIによるスレッドセーフ状態
{-# LANGUAGE OverloadedStrings #-}
import Network.Wai
import Network.Wai.Handler.Warp
import Network.HTTP.Types
import Control.Monad.State
import Data.ByteString.Lazy.Char8
main = run 3000 app
text x = responseLBS
status200
[("Content-Type", "text/plain")]
x
app req = return $ text "Hello World"
app1 req = modify (+1) >>= return . text . pack . show
-- main1 = runStateT (run 3000 app1) 0
コメント行はもちろん、動作しません。その目的は、状態モナドにカウンタを格納し、すべての要求に対して増加する値を表示することです。
スレッド安全性を取得するにはどうすればよいですか?ワープはミドルウェアを順番に、または並行して実行しますか?
州にはどのようなオプションがありますか?このシナリオではIORef
以外に何かがありますか?
私は州が安全を認めているが、州は許可していないようです。
私は死んで簡単なシングルスレッドRPCが必要です。どこからでも呼び出すことができます。 Haxr
パッケージには、余計なWebサーバーが必要です。 Calling Haskell from Node.JSを参照してください。私はWai/WarpとAesonを使ってシンプルなサーバーを書いたので、何も提案はありませんでした。しかし、WAIはコンカレントな実装をサポートするように設計されているため、複雑なものになっているようです。
最初のものは 'Precedence parsing error can not mixed 'と表示されます。 [infixr 9]と 'liftM' [infixl 9]を同じ中置式で使用する。 2つ目は、 'StateT'と' runStateT'のあいまいな使い方を報告します。 'importControl.Monad.State'がコメントされた後、'スコープ内にありません:タイプコンストラクタまたはクラス 'ResourceT''; 'Control.Monad.Trans.Resource'を' import 'した後、 '予想される型に一致できませんでした'と報告します。ResourceT IO t0'' – Inaimathi