7

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

假设我正在开发一个网络服务器,我想在请求之间保持持久状态;例如,计数器。Haskell 的做事方式是什么?

我在 Google 搜索中遇到了这个讨论。提议的解决方案看起来像是不该做什么的一个很好的例子。

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

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

注册处理程序时,可以使用 main 中创建的 MVar 对其进行 curried。

一定会有更好的办法。我不禁认为我正在以一种非功能性的方式解决这个问题。

谢谢!

4

2 回答 2

4

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

请注意,MVar 不是持久的;当服务器重新启动时,计数器将被重置。如果这实际上是您想要的行为,我建议您改用TVar;这样您就可以自动更新计数器,而不会出现锁或随之而来的死锁风险。

于 2013-01-26T16:10:14.787 回答
1

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