Remix.run Logo
endgame 2 hours ago

This paper is up to Oleg's usual high standard, and is a very important step to read if you're catching up on the history of effect systems in Haskell.

As a user, I think effect libraries in Haskell trade off between five main constraints:

* Typelevel wizardry

* Boilerplate

* Performance

* Ability to handle "higher-order" effects (e.g., `bracket`)

* Safety (e.g., not accidentally leaking effects beyond their scope)

The most compelling libraries I've seen from the industrial perspective are the "IO-wrapper" libraries like `cleff`, `effectful`, and `bluefin`. These libraries tend to give good performance, can handle higher-order effects, but trade off a little safety to get the typelevel stuff down a bit. Of these, I currently favour `effectful` but am keeping an eye on `bluefin` (which is very close to `effectful` but with explicit handle-passing). The explicit handle-passing in `bluefin` seems to get the typelevel down a bit more in exchange for asking the user to write a little more boilerplate to explicitly pass handles around.