As a joke, I wrote an instance of Alternative for IO actions:<div><br></div><div><div>{-# LANGUAGE ScopedTypeVariables #-}</div><div>module Main where</div><div><br></div><div>import Control.Applicative</div><div>import Control.Exception</div>

<div><br></div><div>instance Alternative IO where</div><div>  empty = undefined</div><div>  x &lt;|&gt; y = handle (\ (_ :: SomeException) -&gt; y) x</div><div><br></div><div>This would allow to write IO code which failsafes to a value if the previous computation failed, i.e.:</div>

<div><br></div><div><div>*Main Control.Applicative&gt; undefined &lt;|&gt; print &quot;Hello&quot;</div><div>&quot;Hello&quot;</div><div>*Main Control.Applicative&gt; print &quot;Hello&quot; &lt;|&gt; undefined</div><div>

&quot;Hello&quot;</div><div><br></div><div>It seems a neat way to catch exception in some scenarios. What do you think? Why is not Alternative IO defined in Control.Applicative?</div></div><div><br></div><div>Thanks,</div>

<div><br></div><div>Cristiano</div>
</div>