What are the drawbacks of System.IO / Base being bound to the MonadIO typeclass instead of straight IO?
Effect systems are becoming quite popular, and MTL has been normative for years. Polymorphic System.IO would make it much more convenient to use Prelude IO functions (i.e, saving you a ton of liftIOs), and the same would apply to corresponding functions in quasi-base like ByteString and Text.
Curiously enough, here’s a thread involving the opposite choice - using IO a directly:
Based on the OP’s comments therein, the major (theoretical) concern with switching System.IO or base to the MonadIO class would be a drop in performance.
Is it really “a ton” of liftIOs? From my understanding the usefulness of effect systems is in the ability to decouple function definitions and their implementations, so most (if not all) of the IO should reside in those implementation parts.