2015-06-04 151 views
2

我正在閱讀(用於自學目的)Bryan O'Sullivan流行的poollibrary的源代碼。需要幫助瞭解`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這裏有必要?

預先感謝您的提示!

回答

4

我想我對此負責。不,沒有任何目的,它可以被刪除。我認爲在重構之前這是必要的。你可以發送拉請求,併成爲一個真棒圖書館的一部分:)

+1

我明白了,非常感謝你的澄清。我會嘗試準備併發送拉請求。再次感謝。 – bmk

4

這是一個歷史神器。最初只有withResource函數,它usedliftBase因爲它生活在MonadControlIO類。然後代碼被提取到takeResource,但liftBase仍然存在。

+1

謝謝你的澄清! – bmk