非純粋性を関数型コアから分離するための型

データベースや外部API通信といった外部の状態を取得したり変更したりといった副作用のあるコードは、IO型でラップすることができる

コード上では外部の通信結果としてIO型を返すことで、何度呼ばれようが同じようにIO型の値を返す(=純粋関数)

副作用が発生するのはIO型の値を取り出す時(scalaだとunsafeRunsync()