Not quite a ready-made solution, but with guard
(from Control.Monad
) and (<$)
(from Data.Functor
) we can write:
ensure :: Alternative f => (a -> Bool) -> a -> f a
ensure p a = a <$ guard (p a)
(Thanks to Daniel Wagner for suggesting a nice name for this function.)
A more pointfree spelling of dubious taste is p -> (<$) <*> guard . p
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…