Фильтр для первого соответствующего действия monadi c (без оценки всех действий)? - PullRequest
1 голос
/ 18 января 2020

Существует ли стандартная / оптимизированная реализация следующей функции, которую я пишу (вероятно, излишне):

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

Пример использования:

filterFirstM (== 1) [pure 0 :: IO Int, pure 1, error "not evaluated"] == (pure 1)
...