Sure.  I&#x27;ve previously written up a short description of the approach here: <a href="http:&#x2F;&#x2F;andyfriesen.com&#x2F;2015&#x2F;06&#x2F;17&#x2F;testable-io-in-haskell.html" rel="nofollow">http:&#x2F;&#x2F;andyfriesen.com&#x2F;2015&#x2F;06&#x2F;17&#x2F;testable-io-in-haskell.htm...</a><p>The general high-level approach is that your business logic functions run in some monad, constrained by the set of capabilities it requires.  Each capability is represented as a typeclass.<p>Your type signatures say that your business actions work in <i>every</i> monad that supports those capabilities, so the type checker rejects any code that tries to use &quot;unblessed&quot; side effects.