This document discusses non-imperative functional programming and demand-driven I/O. It proposes modeling I/O as a type of (a :-> b) where operations return results on demand. This avoids issues with mixing lazy and eager contexts by making all I/O lazy. The document suggests implementing this using a runI function to run a (a :-> b) in the IO monad.