is the ultimate result of a program. For simplicity we will give an example of

IOTree

that gives semantics for teletype IO.

data IOTree = Done
| PutChar Char IOTree
| GetChar (Char-> IOTree)

(This is a tree because the

GetChar

node has one subtree for every character)

IOTree

contains all the information needed to execute teletype interactions.
One interprets (or executes) an

IOTree

by tracing a route from root of the tree to a leaf.
If a

PutChar

node is encountered, the character data contained at that node is output to the terminal and then its subtree is executed. It is only at this point that Haskell code is ever necessarily evaluated in order to determine what character should be displayed before continuing. If a

GetChar

node is encountered, a character is read from the terminal (blocking if necessary) and the subtree corresponding to the character received is executed. If