関数型プログラミング
関数型プログラミングでは、数学的な関数を組み合わせて計算を表現するが、それだけではファイルの読み書きのような外界とのやり取りを要する処理を直接的に表現できない。このような外界とのやり取りを I/O (入出力) と呼ぶ。数学的な計算をするだけ、つまり 1 + 1 のようなプログラム内で完結する処理ならば、入出力を記述できなくても問題ないが、現実的なプログラムにおいてはそうでない。
非純粋な関数型プログラミング言語においては、式を評価すると同時に I/O が発生する関数を用意することで入出力を実現する。たとえば、 F# 言語では、printfn "Hi." が評価されると、 () という値が戻ってくると同時に、画面に Hi. と表示される I/O が発生する。
Haskell では、評価と同時に I/O が行われる関数は存在しない。たとえば、 putStrLn "Hi." という式が評価されると IO () 型を持つ値が返されるが画面には何も表示されず、この値が Haskell の処理系によって解釈されて初めて画面に Hi. と表示される。 I/O アクションとは、ファイルの読み書きやディスプレイへの表示などのような I/O を表現する式のことである。 IO a という型は、コンピュータへの指示を表す I/O アクションを表現している。ここでの IO はモナドと呼ばれるものの一つである。
Clean では、一意型を用いて入出力を表す。