Agreed that 'label' is a better name than goto/replay.
It didn't even hit me until I saw setJump that `m (m a)` doesn't allow representing recursive functions with arguments, so `a -> m(a -> m b, a)` does seem much more expressive to me
Starting with my original examples, introducing the recursive binding when there are arguments would look like
`(numberPromptStep, (x,y)) <- setJump (x0, y0)`
`fix $ \numberPromptStep x y -> do`
`numberPromptStep x y = do`
It is slightly annoying that the later 2 can simply add an argument while setJump requires using the uncurried version but I don't see a way around that since >>= itself works that way
`m (m a)` is essentially the 0-tuple version of `a -> m(a -> m b, a)` which makes me wonder if it's even worth having. Sure, it's convenient not to have these unit/() around, but maybe the same argument (heh) could be made for 2-argument and 3-argument versions.
do
numberPromptStep <- setJump
(..)
numberPromptStep
do
(numberPromptStep, x, y) <- setJump2 x0 y0
(..)
numberPromptStep x' y'
Given that, I think `a -> m (a -> m b, a)` is the important one be it called label or setJump and maybe there can be a specialized 0-tuple version (e.g. label_ / setJump_) offering the `m (m a)` special case. I don't feel strongly about it though, since unlike `for_` it wouldn't actually relax constraints, only have a simpler signature.