If you do not want to use Control.Arrow , you can always use Applicative :
withSelf f = (,) <$> id <*> f
Many people will probably really understand this right away, but for something so simple, it's pretty stupid.
Edit
As stated in comment , this can be written even more succinctly, since
withSelf = ((,) <*>)
At first it surprised me, but actually it is very simple: for (->) r , fmap = (.) , So the <$> id completely redundant!
source share