Good call. I agree in disagreeing with his type for 'keep'. I think he was aiming at the idea of "any computation which is liftable to an IO computation" instead of "computation which can be evaluated within an IO context".<p>In my opinion, since 'keep' takes a function which is, in general, fully capable of any effectful action, it necessarily is of the type<p><pre><code>  keep :: IO a -&#62; ...
</code></pre>
but since it's roughly ignoring any potential return 'a', yet still evaluating the function repeatedly, the best type is something like<p><pre><code>  keep :: IO a -&#62; IO [()]</code></pre>