ストリーム (プログラミング)
関数型言語においては専ら、無限の大きさ(長さ、要素数)の再帰的なデータ構造を指す。遅延評価を用いて実装されるため「遅延ストリーム」とも呼ばれる。無限のデータを扱うには、そのうちの一部を切り出したりする関数も必要なほか、ストリームを成すデータも再帰関数によって生成されるため、オブジェクト指向の関数型言語では、これらをまとめてストリームクラスとして実装することもある。関数が出力するストリーム自体は連結リストとして実装されることが多い。
遅延評価は必要なときに必要なだけ関数を評価し、不要になったら関数の評価を正常に中断することができる。このことは再帰呼び出しを中断する条件(停止条件)の判定を一切行わない再帰関数や再帰的な値の定義を可能にする。たとえば階乗を求める関数は、1から順に再帰的にかけ算してその結果を返すよう定義するだけである。上限などを設ける必要はなく、かわりに「結果をn個求めてリストにする」関数や「結果をx個捨てる」関数などを介して呼び出す。条件判定をしないということは、遅延評価を行わない言語では無限ループに陥いるということである。しかしそのような言語でも無限の要素数を持つデータを扱えるようにするため、ストリームに関してだけ遅延評価を取り入れている。
無限に再帰する関数や値から一部を取り出したりするしくみは巧妙にできている。
C++では、標準C++ライブラリのヘッダーファイル<iostream>において、標準入出力ストリームとしてcin、cout、cerr、clogが定義されている。ワイド文字列用には別途wcin、wcout、wcerr、wclogが定義されている。
C++は強く型付けされた言語であるが、この標準入出力ストリームは多重定義によって全く型を意識せずに入出力を行なえる。特定の演算子を多重定義したユーザー定義型(クラスあるいは構造体)も利用できるため、非常に柔軟な入出力が可能である。さらに入出力操作子(マニピュレータ)の導入により、細かな制御が可能となった。
これらの機能により、従来の型消去 (type erasure) や型昇格 (type promotion) を伴う可変長引数を利用したprintf関数で起こりがちであった、型の不一致や制御子の過不足によるバグの可能性がきわめて低くなった。しかしその半面、マニピュレータの仕様など覚えなければならないことが増加し、また記述量もprintfと比べ格段に増えてしまったため、敬遠するプログラマも多い。