可以在 IO monad 中存储由字符串索引的值吗?
Can one store a value indexed by a string in the IO monad?
我想在 managerRawConnection
和 managerModifyRequest
中使用自定义 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
我想在 managerRawConnection
和 managerModifyRequest
中使用自定义 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