
Corentin Dupont
Nobody on that? What I really want is: a computation that can be interrupted if enough result is already there. I would be surprise if that concept doesn't exist already somewhere :)
From this perspective, the "shortcut" you're looking for requires the ability to choose the next action (count another vote or finish
I'd be surprised if this can be done with Applicative without some hackery. Very roughly, we can think of Functors as one-shot actions. For example, the IO instance of Functor lets us perform exactly 1 side-effect; all we can do with the result is map pure functions over it. Applicatives are a static chain of actions. For example, the IO instance of Applicative lets us chain together any number of side-effecting actions, but those actions can't alter the chain itself. Monads are a dynamic chain of actions. They're like Applicatives, but each action can choose which action to perform next based on the previous results. prematurely) based on the previous results (the running total). That's what Monads are good for, but Applicatives can't do it by themselves. There's probably an unsafe* way to do this, which will in fact be safe due to your voting invariant ("if there aren't enough uncounted votes to change the outcome, the outcome cannot change"). Maybe someone who's performed similar optimisations can help. Good luck! Chris