# Bryan O'Sullivan et al. - Real World Haskell Chapter 7. IO (Highlights)

## Metadata
**Review**:: [readwise.io](https://readwise.io/bookreview/58004735)
**Source**:: #from/readwise #from/reader
**Zettel**:: #zettel/fleeting
**Status**:: #x
**Authors**:: [[Bryan O'Sullivan]], [[Don Stewart]], [[John Goerzen]]
**Full Title**:: Real World Haskell Chapter 7. IO
**Category**:: #articles #readwise/articles
**Category Icon**:: 📰
**URL**:: [book.realworldhaskell.org](https://book.realworldhaskell.org/read/io.html)
**Host**:: [[book.realworldhaskell.org]]
**Highlighted**:: [[2026-02-01]]
**Created**:: [[2026-02-07]]
## Highlights
- There are three pre-defined `Handle`s in `System.IO`. These `Handle`s are always available for your use. They are `stdin`, which corresponds to standard input; `stdout` for standard output; and `stderr` for standard error. ([View Highlight](https://read.readwise.io/read/01kgdqwcf6arjq7wba93hhmtrf)) ^983976865
- I/O actions are defined within the IO monad. ([View Highlight](https://read.readwise.io/read/01kgds91vkgm257dx1sbk6p1p3)) ^983984727
- You could think of it this way: every statement, except `let`, in a `do` block must yield an I/O action which will be executed. ([View Highlight](https://read.readwise.io/read/01kgdsc3var64wsmthqrnpf88r)) ^983984915
- `do` blocks are actually shortcut notations for joining together actions. There are two operators that you can use instead of `do` blocks: `>>` and `>>=`. ([View Highlight](https://read.readwise.io/read/01kgdsfnwrcy3w3echksmp4ypq)) ^983985049