The one axis which is missing is “contained” versus “uncontained”. Effects in Haskell are containedâ€”this is a large point the motivation of monads. On the other hand, at least some effects almost everywhere else are uncontained. The big advantages of containment have to do with local reasoning. A surprising local advantage of contained effects, however, is that they let you embed microlanguages with some set of (contained) effects which get interpreted into the metalanguage. This is how Haskell both has genuine reference mutability (via the ST monad) and “non-determininstic breadth first search with streaming logging” via some combination of Omega and Pipe.

The one axis which is missing is “contained” versus “uncontained”. Effects in Haskell are containedâ€”this is a large point the motivation of monads. On the other hand, at least some effects almost everywhere else are uncontained. The big advantages of containment have to do with local reasoning. A surprising local advantage of contained effects, however, is that they let you embed microlanguages with some set of (contained) effects which get interpreted into the metalanguage. This is how Haskell both has genuine reference mutability (via the ST monad)

and“non-determininstic breadth first search with streaming logging” via some combination of Omega and Pipe.