函数式编程 - HaskellWebserver:维护应用程序状态



我试图通过开发类似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)

相关内容

  • 没有找到相关文章

最新更新