可以在 IO monad 中存储由字符串索引的值吗?

Can one store a value indexed by a string in the IO monad?

我想在 managerRawConnectionmanagerModifyRequest 中使用自定义 ManagerSettings to build a custom Network.Wreq.Session. I modify from the defaultManagerSettings

我希望 managerModifyRequest 使用文件中运行时已知的配置值。因为我做了很多请求,所以我不想进行很多系统调用来从文件中获取配置值。

我发现类型 managerModifyRequest :: Request -> IO Request 有问题。如果无法从参数中获取配置值,我该如何使用它?

我考虑过 IORefs and MVars 将值存储在内存中,但我应该能够以某种方式将所述 IORef 或 MVar 传递给函数...

我不熟悉这个库,但我想你需要这样写:

-- pseudocode
foo = do
   -- create the IORef here
   r <- newIORef "hello"
   let settings = defaultManagerSettings{
          ...
          managerModifyRequest = \req -> do
             -- use the IORef here
             s <- readIORef r
             putStrLn s
             writeIORef r (s ++ "!!")
             return req
          }
   use settings

您不需要将 IORef 作为附加参数传递给 managerModifyRequest ,您需要在 IORef 所在的范围内定义 Request -> IO Request 函数可用。


或者,使用带有附加参数的辅助函数,然后使用 IORef:

部分应用它
-- pseudocode
foo = do
   -- create the IORef here
   r <- newIORef "hello"
   let settings = defaultManagerSettings{
          ...
          managerModifyRequest = myManager r
          }
   use settings

myManager :: IORef String -> Request -> IO Request
myManager r req = do
   -- use the IORef here
   s <- readIORef r
   putStrLn s
   writeIORef r (s ++ "!!")
   return req