Some people say that IO in Haskell is pure and has referential transparency. They argue that an IO value describes an action and can be joined with other actions using monadic bind, but is not the action itself.