Haskell は純粋であるだとか、参照透過性を満たしているだとかよく話題になる。参照透過性を満たしているということは、同じ関数に同じ引数を渡せば、いつ、誰が簡約しても結果が変わらないということを意味している。いつ簡約しても結果が変わらないということは、並列に簡約しても良いわけだし、逆順に簡約してもいいわけだし、コンパイル時に簡約したっていいわけだ。じゃあ、以下のコードが、常に HELLOWORLD を出力し、 WORLDHELLO となることはない理由は何なのか? putStr "WORLD" は putStr "HELLO" よりも先に簡約したって良いのでは? 実際のところ、「IO モナドってのは特別なんだ」とかそういう理解であっても、とりあえずモノを作るにはそんなに困らない。だいたいそう動くし、そういうもんだと思っていれば十分である。 でも、どういう仕組みなのかやっぱり気になるよね?
![Haskell の IO モナドと参照透過性の秘密 | Webシステム開発/教育ソリューションのタイムインターメディア](https://cdn-ak-scissors.b.st-hatena.com/image/square/67a1645b6cf471458e05ccd4f1761616845bceeb/height=288;version=1;width=512/https%3A%2F%2Fwww.timedia.co.jp%2Fwp-content%2Fuploads%2F2022%2F04%2F13564.png)