小编fyc*_*cth的帖子

Haskell中ConcurrentHashMap的类比是什么?

更新:请记住,我刚刚开始学习Haskell

假设我们正在编写具有以下一般功能的应用程序:

  • 在启动时,它从外部源收集一些数据;
  • 这些数据是一组复杂的结构,包含列表,数组,整数,字符串等;
  • 在运行时,应用程序提供Web API(servlet),提供对数据的访问.

现在,如果应用程序是用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处理程序吗?或者还有其他更正确的方法吗?

multithreading haskell servlets

5
推荐指数
2
解决办法
498
查看次数

如何在Servant中使用log-warper?

我有一个基于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)

logging haskell servant

5
推荐指数
0
解决办法
190
查看次数

标签 统计

haskell ×2

logging ×1

multithreading ×1

servant ×1

servlets ×1