::on the next line. We've also reverted to using tuple-style constraints, because in practive they making distinguishing between the constraints and argument types.
do-notation and normal notations.
MonadIO. This prevents you from needing to generalize the function at the call site, while still able to use it in