io-effects: Taming the IO monad

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.


Welcome to io-effects, a light-weight yet high performance effect library with the aim of taming the IO monad. The IO monad is the workhorse of any Haskell program - the entry point of our program is main :: IO (), and there is no way to "leave" IO once you're there. However, the IO monad has a huge amount of power - it can open files, perform network requests, and - as they saying goes - launch the missiles. All of these are important functions, but as our programs grow it becomes increasingly difficult to reason about what IO is being performed. For example, asking the question "does this program access my database?" is a difficult question to answer - with only IO, we have no option other than reading all of the source code.

Enter io-effects. Programs written using io-effects are just like the IO programs we're familiar with, but exactly what IO is being performed is explicitly described in the types of our programs. A program that has access to a database may have a type such as Member Database es => Program es a. In fact, if es is truly polymorphic, this program can do nothing but access a database. These constraints can be combined as well, so a program with the type ( Member Database es, Member HTTP es ) => Program es a is a program that may access a database or may make HTTP requests.

For more information, see the main IO.Effects module, which contains a brief demonstration.


Change logNone available
Dependenciesbase (>= && <4.12 || >= && <4.13) [details]
MaintainerOllie Charles <>
UploadedSun Jul 14 20:56:42 UTC 2019 by OliverCharles




Maintainers' corner

For package maintainers and hackage trustees