2015-06-04 114 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