Eff is a functional programming language based on algebraic effect handlers. This means that Eff provides handlers of not only exceptions, but of any computational effect, allowing you to redirect output, wrap state modifications in transactions, schedule asynchronous threads, and much much moreā€¦

Try it out in your browser!

Algebraic effects, on which Eff is built, give rise to a uniform representation of all computational effects. Effects are thus first-class citizens of Eff and can be seamlessly combined. There is no need for the do notation, no need for monad transformers, and no need to reshuffle your whole program just to read a global flag.

Just like exceptions are a particular instance of an effect, exception handlers are a particular instance of effect handlers. In Eff, you can silence standard output, redirect it to a different channel, or even rearrange it. Similarly, state modifications can be prevented or grouped in transactions.

As handlers completely override the behaviour of effects, there is no need for a default behaviour to start with. Eff allows you to define your own effects. Just declare a choice operation and start writing your nondetermnistic programs. Later, you can write a handler that computes a single possible result, an optimal result, or a list of all results.

The purpose of Eff is to test new concepts in programming languages, in particular ones regarding computational effects. We discourage the use of Eff in production, as it has no library support, little documentation and is prone to change.