副作用(side-effect)をめぐって

Haskellプログラミングを始めようとしているプログラマに「Haskellには副作用があるのか」という質問をされると,「ある」と答えるHaskellerと「ない」と答えるHaskellerがいるらしい(私は「ない」と答える派).これでは,「いったいどっちが本当?」ということになる.すこし慎重な人は「Haskellには副作用はないけど,副作用を表現はできる」と答えるらしい.それでもやっぱり,「副作用を表現?それと副作用はどう違うの?結局,どっち?」ということになる.

この話の通じ難さは,質問者と回答者とが「副作用」という言葉の意味を共有していないことによる.質問者の考えている「副作用」と回答者の考えている「副作用」の意味の違いを明らかにしていないので,理解できないし,してもらえないように思う.

Haskellと副作用の関係は,どう説明すれば理解でき,人に伝えられるかを徒然に考えてみる.

Haskellには副作用がないのにどうしてゲームが書けるのか

こういう質問なら,おそらくは,「副作用=入出力」「入出力=ユーザのボタン操作,画面でのキャラクタの動きを表示」という前提である.Haskellでは入出力を表現できるし,ゲームを書ける.現にHaskellで書いたゲームはいくつも存在している.「入出力を表現できること」と「副作用があること」とを同じことだという前提を認めて歩み寄るなら,

Haskellには副作用がない」というのは間違いであって,「Haskellには副作用がある」のでゲームが書ける

という回答がなりたつ.「Haskell」に副作用はあるのかという問に「ある」と答えるHaskellerならこういう立場をとるだろう.

ただ,この答で質問者は納得できるだろうか.「純粋関数型言語Haskellには副作用はなく,並列プログラムの記述に最も適している」などという宣伝を散々聞かされたあとに,「Haskellには副作用はある」といわれて,ずッコケたりしないだろうか.あの宣伝はなんだったのか.看板に偽りがあったのか.
Haskellerしても,前提条件付きとはいえ「Haskellには副作用がある」という言い方に違和感を感じないだろうか.

Haskellには副作用がないのにどうして入出力が表現できるのか

質問者が質したかったのは,こちらではなかったのだろうか.

(つづきは後で書く…あるいはHIMA3へ)