Haskell Webserver:维护应用程序状态

时间:2013-01-25 19:19:17

标签: haskell functional-programming happstack

我正在尝试通过开发web-app-ish服务来更熟悉Haskell。

假设我正在开发一个Web服务器,我希望在请求之间保持持久状态;例如,一个柜台。什么是Haskell的做事方式?

我在Google搜索中遇到了这个discussion。建议的解决方案看起来就是不该做的一个很好的例子。

我有一个想法是让请求处理程序接受一个MVar:

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

注册处理程序时,可以使用在main中创建的MVar进行调整。

必须有更好的方法。我不禁想到我正在以非功能性的方式解决这个问题。

谢谢!

2 个答案:

答案 0 :(得分:4)

您可能需要acid-state,它可以为您提供Haskell数据类型的完全持久状态。我链接的文档甚至从请求计数器开始,就像你要求的那样。

请注意,MVars不是持久性的;重新启动服务器时,计数器将重置。如果这实际上是您想要的行为,我建议您使用TVar代替;这样你可以原子地更新计数器,而不会有锁或者与它们一起出现死锁的风险。

答案 1 :(得分:1)

如果你喜欢持久性和TVars,你可以使用DBRefs,它们具有与TVars相同的语义和相同的使用模式。您必须为状态定义唯一键,并且您具有自动文件持久性。对于数据库持久性,有必要定义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)