
From "Fixing Haskell IO": We can summarize the SDIOH (Standard Definition of IO in Haskell) as "a value of type IO a is a value, that performs, then delivers a value of type a".
I think you've already made a critical mistake here. The quotes you give all describe an IO value as something that "when performed" results in input/output, whereas your summary describes it as something "that performs". The original quotations suggest that some outside agent interprets the values and performs the actions they denote, whereas it is your summary that has made the linguistic shift to values that dance about on tables of their own accord. In my mind, Haskell programs never actually "do" anything. Instead they merely denote a value of type IO () that consists of tokens representing input/output primitives, glued together by pure functions. It is the job of the runtime to take that value and actually modify the world in the manner described by the program. Stuart