This is a fine explanation of baby-free-monads and how they are analogous to Haskell IO. I do think it should be pointed out though that this is only one way to accomplish IO from a purely functional system. Albeit a very popular and useful one
A baby-free-monad sounds like a monad that doesn’t have any babies inside :)
(avoid success) at all costs vs avoid (success at all costs)
(baby-free)-monad vs baby-(free-monad)
What are some examples of other ways to accomplish IO in a purely functional system?
I think the three big ones are that I’m familiar with are:
I don’t know of too many examples of the second two, but the first one has gained quite a bit of popularity in the last few years.