我试图通过开发类似Web应用程序的服务来更熟悉Haskell。
假设我正在开发一个Web服务器,我想在请求之间保持持久状态;例如,计数器。 Haskell的做事方式是什么?
我在谷歌搜索中遇到了这个讨论。 建议的解决方案看起来像是不该做什么的一个很好的例子。
我的一个想法是让请求处理程序采用 MVar:
requestHandler :: MVar State -> IO (Maybe Response)
注册处理程序时,可以使用在 main 中创建的 MVar 来柯里
。一定有更好的方法。 我不禁认为我正在以一种非功能性的方式解决这个问题。
谢谢!
你可能想要酸态,它给了你:Haskell数据类型的持久状态。 我链接的文档甚至以请求计数器开头,就像您要求的那样。
请注意,MVars 不是持久性的;当服务器重新启动时,计数器将被重置。 如果这实际上是您想要的行为,我建议您改用 TVar;这样,您就可以以原子方式更新计数器,而不会有锁或随之而来的死锁风险。
如果你喜欢持久性和 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)