更新:请记住,我刚刚开始学习Haskell
假设我们正在编写具有以下一般功能的应用程序:
现在,如果应用程序是用Java编写的,我们可以使用静态ConcurrentHashMap对象来存储数据(代表Java类).因此,在启动期间,应用程序可以使用数据填充地图,然后servlet可以访问它,为客户端提供一些API.
如果应用程序将用Erlang编写,我们可以使用ETS/DETS来存储数据(作为本机Erlang结构).
现在的问题是:实现这种设计的Haskell方法是什么? 它不应该是DB,它应该是某种轻量级的内存存储器,它可以存储复杂的结构(Haskell本机结构),并且可以从不同的线程(servlet,Java-world实体交谈)访问.在Haskell中:没有像Java中那样的静态全局变量,没有Erlang中的ETS和OTP,所以如何以正确的方式完成(没有使用像Redis这样的外部解决方案)?
谢谢
更新:问题的另一个重要部分 - 因为Haskell没有(?)具有'全局静态'变量,那么实现这个'全局可访问'数据保持对象的正确方法是什么(比如,它是"stm-containers" ")?我应该在'main'函数中的某个地方初始化它,然后将它传递给每个REST API处理程序吗?或者还有其他更正确的方法吗?
我有一个基于Servant之上的应用程序,现在我想向该应用程序添加日志记录。我浏览了Haskell日志包,并假设此包提供了我所需要的:https : //github.com/serokell/log-warper/blob/master/log-warper/examples/HowTo.md
通常使用Servant构建应用程序的“设计模式”之一是使用Reader monad,因此我对应用程序使用这种方法:我有包含AppConfig的AppEnv。通常,我可以在AppEnv中添加类似“ logger”实体的内容,并在处理程序中使用它。尽管log-warper不提供“记录器”,但它使用了不同的方法(我认为这似乎是另一个monad;请参见上面链接中的示例)。因此,我不知道如何在Servant中使用此记录器。
这是我基于Servant的应用程序(基于文档中的示例使用了Servant的最新版本:http : //haskell-servant.readthedocs.io/en/stable/tutorial/Server.html#welcome-hoistserver):
data AppEnv = AppEnv { config :: Config }
type MyHandler = ReaderT AppEnv (ExceptT ServantErr IO)
startApp :: AppEnv -> IO ()
startApp env = do
run 16384 (app env)
app :: AppEnv -> Application
app env = serve readerAPI (readerServer env)
readerAPI :: Proxy ReaderAPI
readerAPI = Proxy
readerToHandler :: AppEnv -> Reader AppEnv a -> Handler a
readerToHandler env r = return (runReader r env) …Run Code Online (Sandbox Code Playgroud)