我目前正在阅读(出于自学目的)Bryan O'Sullivan 的流行 pool
的源代码 library .
我在函数 takeResource
中有一个问题,我想在这里询问 Haskell 专家。
该函数定义为:
takeResource :: Pool a -> IO (a, LocalPool a)
takeResource pool@Pool{..} = do
local@LocalPool{..} <- 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
?
提前感谢您的提示!
最佳答案
我认为我对此负有责任。不,它在那里没有任何意义,可以将其删除。我认为在进行一些重构之前这是必要的。您可以发送拉取请求并成为很棒的库的一部分:)
关于haskell - 需要帮助来理解 `liftBase` 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30645867/