<div dir="ltr"><p dir="ltr">It kind of seems like there should be fold-like things to match some and many.</p><p dir="ltr">foldrAlt :: Alternative f => (a -> b -> b) -> b -> f a -> f b<br>foldrAlt c n m = foldr1Alt c n m <|> pure n<br><br>foldr1Alt :: Alternative f => (a -> b -> b) -> b -> f a -> f b<br>foldr1Alt c n m = c <$> m <*> foldrAlt c n m<br></p><p dir="ltr">foldlMP' :: MonadPlus f => (b -> a -> b) -> b -> f a -> f b<br>foldlMP' f b m = foldl1MP' f b m <|> pure b</p><p dir="ltr">foldl1MP' :: MonadPlus f => (b -> a -> b) -> b -> f a -> f b<br>foldl1MP' f b m = m >>= \r -> let !b' = f b r in foldlMP' f b' m<br><br>--These look a bit iffy<br>foldlAlt :: Alternative f => (b -> a -> b) -> b -> f a -> f b<br>foldlAlt f b m = ($ b) <$> foldrAlt (\x r acc -> r (f acc x)) id m<br><br>foldl1Alt :: Alternative f => (b -> a -> b) -> b -> f a -> f b<br>foldl1Alt f b m = ($ b) <$> foldr1Alt (\x r acc -> r (f acc x)) id m<br></p><p dir="ltr">Do these or similar exist somewhere? If not, should they exist somewhere? I'm particularly interested in whether either of these will be fast, or will admit a fast implementation, for attoparsec parsers.</p><p>Thanks,</p><p>David Feuer<br></p></div>