我正在尝试通过开发web-app-ish服务来更熟悉Haskell。
假设我正在开发一个Web服务器,我希望在请求之间保持持久状态;例如,一个柜台。什么是Haskell的做事方式?
我在Google搜索中遇到了这个discussion。建议的解决方案看起来就是不该做的一个很好的例子。
我有一个想法是让请求处理程序接受一个MVar:
requestHandler :: MVar State -> IO (Maybe Response)
注册处理程序时,可以使用在main中创建的MVar进行调整。
必须有更好的方法。我不禁想到我正在以非功能性的方式解决这个问题。
谢谢!
答案 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)