问题
Is there a standard / optimized implementation of the following function that I'm writing (probably unnecessarily):
filterFirstM :: (Monad m, Foldable t) => (a -> Bool) -> t m a -> m a
filterFirstM predicate actions = foldlM fn Nothing actions
where
fn memo action = case memo of
Just _ -> pure memo
Nothing -> do
x <- action
pure $ if predicate x then (Just x) else Nothing
Sample usage:
filterFirstM (== 1) [pure 0 :: IO Int, pure 1, error "not evaluated"] == (pure 1)
来源:https://stackoverflow.com/questions/59798509/filter-for-first-matching-monadic-action-without-evaluating-all-actions