我正在阅读(用于自学目的)Bryan O'Sullivan流行的pool
library的源代码。需要帮助了解`liftBase`的用法
我在函数takeResource
中有一个问题,我想问问这里的Haskell专家。 该函数定义为:
takeResource :: Pool a -> IO (a, LocalPool a)
takeResource [email protected]{..} = do
[email protected]{..} <- getLocalPool pool
resource <- liftBase . join . atomically $ do
ents <- readTVar entries
case ents of
(Entry{..}:es) -> writeTVar entries es >> return (return entry)
[] -> do
used <- readTVar inUse
when (used == maxResources) retry
writeTVar inUse $! used + 1
return $
create `onException` atomically (modifyTVar_ inUse (subtract 1))
return (resource, local)
我有被
...
resource <- liftBase . join . atomically $ do
...
为什么这里的liftBase
必要使用问题的线?我们是否也可以写
...
resource <- join . atomically $ do
...
编译器接受这两个版本。我在这里想念一些琐碎的事情吗?为什么liftBase
这里有必要?
预先感谢您的提示!
我明白了,非常感谢你的澄清。我会尝试准备并发送拉请求。再次感谢。 – bmk