lexi-lambda / freer-simple

A friendly effect system for Haskell
https://hackage.haskell.org/package/freer-simple
BSD 3-Clause "New" or "Revised" License
228 stars 20 forks source link

Use lenses to permit "focusing" on a State effect #39

Open jwiegley opened 2 years ago

jwiegley commented 2 years ago

A draft PR to show the concept....

One of the great things about algebraic effects is that they allow you to focus the range of effects needed by a function to its most limited set: the "weakest precondition of effects", if you will.

This PR shows a simple way to make this idea more flexible. For example, I often have an "application state" carried by an effect State s, but many of my functions need only a part of this state, or they may need those parts only in read-only or append-only terms. It could be that I have a huge state, and my function needs read-only access to one part and read-write access to another part, but none of the rest.

The current freer-simple library already makes this fairly easy to do, but users have to write the reinterpretations themselves. This PR offers a few combinators for lensing into state in these different ways.

I doubt you'd want to include lens as a dependency, but if you think it's useful maybe it could become its own library. I also want to see how this idea plays out in other libraries like fused-effects.