Yup. Here&#x27;s an example.<p>There is no function<p><pre><code>    print :: String -&gt; ()
</code></pre>
(The type () implies &quot;no interesting return value&quot;).<p>This function could only be written via deliberate subversion of the type system. Instead it must be<p><pre><code>    print :: String -&gt; IO ()
</code></pre>
Which is similar, but the return is marked by this IO type. Essentially this restricts you to ensure that side effecting functions are executed in explicit sequence and cannot &quot;poison&quot; pure types.