【发布时间】:2012-05-04 13:28:44
【问题描述】:
我想编写一个 Web 服务器,将其状态存储在带有 wai/warp 的 State monad 中。像这样的:
{-# 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
当然,注释行不起作用。目的是将计数器存储在 state monad 中,并在每次请求时显示其递增的值。
另外,我如何获得线程安全? warp 是顺序运行还是并行运行我的中间件?
该州有哪些可用选项 - 除了IORef 我可以在这种情况下使用什么?
我知道 State 提供安全,但似乎 wai 不允许 State。
我只需要一个可以从其他地方调用的非常简单的单线程 RPC。 Haxr 软件包需要一个单独的 Web 服务器,这有点过分了。请参阅Calling Haskell from Node.JS - 它没有任何建议,所以我使用 Wai/Warp 和 Aeson 编写了一个简单的服务器。但似乎 WAI 旨在支持并发实现,因此它使事情变得复杂。
【问题讨论】:
标签: haskell concurrency state haskell-warp haskell-wai