我目前正在执行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)
我想知道我是否可以根据waitEither
和wait
函数实现该功能:
{-# 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
这两个版本是完全相同还是存在任何微妙的语义或性能差异?