9. IO
Lean は純粋関数型プログラミング言語です。Lean のコードは実行時に正格評価されますが、型チェック、特に definitional equality のチェックをする際に使用される評価の順序は形式的に指定されておらず、パフォーマンスを向上させる今後変更の可能性がある多くのヒューリスティックを使用しています。つまり、副作用(ファイル I/O・例外・可変な参照など)を実行する操作を単純に追加すると、作用の順序が特定されないプログラムになります。型チェックでは、自由変数を持つ項でさえも簡約されます;これは副作用の予測をさらに難しくします。最後に、Lean のロジックの基本法則は、関数は定義域の各要素を値域の一意な値にマッピングする 関数 であるということです。コンソール I/O・任意の可変状態・乱数生成などの副作用を含めると、この原則に反することになります。
副作用を持つ可能性のあるプログラムを純粋な関数と区別するための型(一般的に IO α
と書かれる)があります。論理的に言えば、 IO
は副作用のシーケンスとデータの依存関係を記述します。ファイルからの読み込みなどの基本的な副作用の多くは、Lean の論理の視点からすると不透明な定数です。その他の副作用は、実行時のコードと論理的に同等なコードによって指定されます。実行時には、コンパイラは通常のコードを生成します。