我正在閱讀(用於自學目的)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