Haskellの特徴として pure ということが挙げられる。 pure というのは副作用がないってこと。 画面に何か出力したり、ファイルから読み込んだり、ネットワーク通信したり、というのは副作用に分類される。 しかし実際のところは Haskell で書いたプログラムでファイルを読み込んだりできる。 pure なのに。どういうこと?
みんなだいすき JavaScript を例にして簡単に説明してみる。
対象コードはコレ。
alert("hello");
副作用あって、pureじゃないね。
alert()
を pure にしたものとして alertPure()
を考えてみよう。
function alertPure(msg) {
return function () {
return alert(msg);
};
}
alertPure()
関数を呼び出すと関数 function(){return alert(msg);}
が返ってくる。
alertPure()
関数を呼び出しても画面出力は行われないし、いつも同じ関数が返ってくる。
alertPure()
関数は pure だ。
alert("hello")
を Haskell 的に pure に書くと、こうなる。
function alertPure(msg) {
return function () {
return alert(msg);
};
}
var main = alertPure("hello");
えーと、ここまでは pure。 上のコードを実行しても、なにも起こらない。
main
は関数で main()
と呼び出せばアラートが表示される状態だけど、呼び出してないから何も起こらない。
Haskellでのプログラミングではここまでしか書かない。 だから pure だよね。
main
という名前に関数をいれておけば、Haskell 処理系が main()
の関数呼び出しを行うというふうに決まっている。
この役割分担がからくりで、Haskell 言語は pure だけど、処理系が手を汚してくれるので、結果として副作用が起こせるってこと。