<div dir="auto"><div dir="auto">Also worth considering:</div><div dir="auto"><br></div><div dir="auto">manyM :: (Alternative f, Monad f) => f a -> f [a]</div><div dir="auto">manyM v = many_v</div><div dir="auto">    where</div><div dir="auto">        many_v = do</div><div dir="auto">          ma <- optional v</div><div dir="auto">          case ma of</div><div dir="auto">            Nothing -> pure []</div><div dir="auto">            Just a -> liftA2 (:) a many_v</div><div dir="auto"><br></div><div dir="auto"><span style="font-family:sans-serif">someM :: (Alternative f, Monad f) => f a -> f [a]</span><br></div><div dir="auto">someM v = liftA2 (:) v (manyM v)</div><div dir="auto"><br></div><div dir="auto">Unlike the default definitions, these bound backtracking when (<|>) represents that.</div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Aug 11, 2018, 1:19 PM David Feuer <<a href="mailto:david.feuer@gmail.com">david.feuer@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto">We currently offer liftA, liftM, liftM2, and ap to implement Functor and Applicative methods in terms of Applicative and Monad ones. But there are a couple other functions in that general vein that are missing. I propose that we should add at least replaceA, and perhaps also beforeM.<div dir="auto"><br></div><div dir="auto">-- (<$) = replaceA</div><div dir="auto">-- This may be better than the default if there is</div><div dir="auto">-- an optimized definition of *> (which may be</div><div dir="auto">-- based on an optimized >>).</div><div dir="auto">replaceA :: Applicative f => a -> f x -> f a</div><div dir="auto">replaceA a fa = fa *> pure a</div><div dir="auto"><br></div><div dir="auto">-- (<*) = beforeM</div><div dir="auto">-- This may be better than the default if there is</div><div dir="auto">-- an optimized definition of <$, or if <$ is defined as </div><div dir="auto">-- replaceA and *> is optimized.</div><div dir="auto">beforeM :: Monad f => f a -> f x -> f a</div><div dir="auto">beforeM fa fx = fa >>= \a -> a <$ fx</div><div dir="auto"><br></div><div dir="auto">Why a <$ fx and not fx >> pure a? Because <$ could be implemented specially, and is unlikely to be implemented by hand using <* if there isn't a custom <*.</div></div>
</blockquote></div>