Pure variants like this one are desugared into a case:
compress x = case x of
[] -> []
[a] -> [a] -- singleton list
(x:y:xs) -> (if x == y then [] else [x]) ++ compress (y:xs)
And can do no monadic monkey business because compress is pure. In this they are simply a more convenient way of spelling out some branches. You wouldn't say
if is a sneaky way of doing sequential dependencies, would you?
Sure, with a monadic function you can also have pattern guards that do monadic stuff, but I don't think you can bind without noticing, and in any case the function type will tell you it's monadic.