在`async`库中实现`waitBoth`函数

时间:2015-10-02 14:44:17

标签: haskell asynchronous

我目前正在执行async库(用于自学目的),并对waitBoth函数有疑问。

库实现如下函数:

waitBoth :: Async a -> Async b -> IO (a,b)
waitBoth left right =
  atomically $ do
    a <- waitSTM left
           `orElse`
         (waitSTM right >> retry)
    b <- waitSTM right
    return (a,b)

我想知道我是否可以根据waitEitherwait函数实现该功能:

{-# LANGUAGE LambdaCase        #-}
{-# LANGUAGE TupleSections     #-}

waitBoth :: Async a -> Async b -> IO (a,b)
waitBoth a b =
  waitEither a b >>= \case
    Left res  -> (res,) <$> wait b
    Right res -> (,res) <$> wait a

这两个版本是完全相同还是存在任何微妙的语义或性能差异?

0 个答案:

没有答案