haskell - 需要帮助来理解 `liftBase` 的用法

标签 haskell

我目前正在阅读(出于自学目的)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/

相关文章:

haskell - 无法使用堆栈构建带有模块导入的项目(在 Windows 上)

list - 在 Haskell 中生成无限列表 [0, 1, -1, 2, -2, ...

haskell - 为什么我不能在 Haskell 中执行 `null (Just 5)` ?

haskell - 如何使用管道对从文件中读取的行进行编号?

Haskell - 获取只出现一次的项目

haskell - Haskell 中可变但可锁定的数据结构?

algorithm - 一些有效的方法来实现这种 map 的插入和查找?

haskell - 这个实例有什么问题: ArrowApply Automaton?

haskell - 将函数元组应用于元组

haskell - 导入模块进行测试