Skip to content

Instantly share code, notes, and snippets.

@tkawachi
Created February 28, 2014 11:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkawachi/9269424 to your computer and use it in GitHub Desktop.
Save tkawachi/9269424 to your computer and use it in GitHub Desktop.
HaskellのピュアさをJavascriptで理解する

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 だけど、処理系が手を汚してくれるので、結果として副作用が起こせるってこと。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment