Haskell shows best and brightest the glamour of monads for i/o, C function calls and other interactions. However lazy i/o expressed by monads is more a matter of style, and can be closely emulated in other languages. Scheme for example allows both unbridled side-effecting interaction, and a "pure", monadic IO with all worldly effects performed only by a distinguished actor.

A message "lazy string-append and HTML generation" gives another example of monads, in concatenating strings. Rather than applying string-append to a list of strings, we can "assume" the operation and leave the list of strings as it is. If we need to concatenate more strings, we will join the corresponding lists. We can assume the join operation as well, and represent (append l1 l2) with just (list l1 l2) . The resulting tree of string chunks denotes the concatenated string: the string-append action is implied but not actually performed. Chances are we may not need any explicit string-append at all: if the resulting string is meant to be written, we will walk the tree instead and display the chunks in-order.