Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MonadFail instance (feature request) #59

Open
dmwit opened this issue Sep 29, 2022 · 2 comments
Open

MonadFail instance (feature request) #59

dmwit opened this issue Sep 29, 2022 · 2 comments

Comments

@dmwit
Copy link

dmwit commented Sep 29, 2022

It would be very handy to have a MonadFail instance that retrys. As a minimal motivating example, consider:

pop :: TVar [a] -> STM a
pop v = do
    a:as <- readTVar v
    writeTVar v as
    return a

With a MonadFail instance, this is a very convenient way of writing a transaction that waits until there's a value available in the stack.

More generally, such an instance would allow one to write a transaction as if all your favorite patterns matched, and the transaction would then efficiently block until it's so.

@samuel-gelineau-at-well-dot

Note that historically, STM used to have a Monad.fail method which was defined as fail = error. Then, when MonadFail was introduced, STM was not given a MonadFail instance with fail = error, as that would go against the spirit of MonadFail.

I don't know why STM originally had fail = error, I agree that it should be fail = retry instead. If STM currently had fail = error, then changing it to fail = retry would be a breaking change. But luckily, MonadFail was introduced a long time ago, so nobody is relying on fail = error anymore, so I do think that it would be a good time to define fail = retry!

@simonmar
Copy link
Member

The example is compelling, but I worry that it would turn accidental pattern match failure into deadlock, which would make debugging much harder. Happy to hear other opinions though.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants