@Nitrodon: An applicative functor that can also do join :: Monad m => m (m a) -> m a ;)
Better answer: In Haskell it's an abstract concept like Enum, Monoid etc, just another type class which provides some functions and is expected (not enforced) to satisfy some laws.
The most important ones are return :: a -> m a and bind :: m a -> (a -> m b) -> m b which is called (>>=).. and since it has to be a Functor and Applicative you also get fmap :: m (a -> b) -> m a -> m b and ap :: m (a -> b) -> m a -> m b.
@user202729 None that I am aware of. Are you asking for golfing? In that case takeWhile can often be replaced by fst.span, and something like snd(span f s)!!0 might be even shorter.