有没有更“monadic”的方法来编写这个函数,而不是诉诸于Either
上的模式匹配?
{-# LANGUAGE LambdaCase #-}
calculate :: (Monad m) => (a -> m (Either e b)) -> Either e a -> m (Either e b)
calculate f = \case
Left err -> return $ Left err
Right vals -> f vals
具体而言,对于我的用例,
m
是IO
;f
是一个接受输入并产生一些 IO
效果或失败的函数,并且输入可能已经失败了。也许可以使用 ExceptT
?