純粋関数ってなんだっけ

http://d.hatena.ne.jp/nagaShima/20090129/p1
初めて聞いた。たぶん純粋関数型言語って語句から 『純粋関数をベースにした言語』 って勘違いしているんだと思うけど、正しくは 『純粋な、関数型言語』 ですよ。純粋関数型言語Haskell だってグローバル変数くらいあります*1

n = 1
foo x = x + n

ただ上のサンプルコードの場合、

  • foo の意味は a に依存してしまっている
    • foo はコンビネータではない
    • a の意味が(もし)変化すれば foo の意味も変化する

という性質が読み取れたりします。純粋関数という単語をコンビネータと混同しているのかな、とも思いました。
それから n が定数であり変化しないものと仮定するならば、上のコードは

foo x = x + 1

へと機械的に変換できて、こちらならば foo はコンビネータです。
ちなみに、java においてもローカルクラス内から外の変数を参照したいときには、その変数が定数である必要ありますけど、それと似たような感じです。

ついで

引数の評価遅延という話もimutableな式なら遅延、mutableな式なら先行でOKになる。

immutable、というか副作用を持たない式は遅延しようが先行しようが (strictness を考慮しなければ) 結果は変わらないのですが、たぶん遅延せず先行させたほうが全体のパフォーマンスは上昇します。先行評価させ、かつメモライズすれば最速になると思います。どこを遅延評価させ、どこをメモライズさせるかの指定をプログラマに課すのか、あるいは処理系で解析するのか、考察すればたぶん論文のネタくらいにはなるんじゃないかな。

*1:正確にはグローバル定数だけど