二種類の関数

contest


世の中には二つの関数がある。副作用のある関数と副作用の無い関数だ。ということを、http://blog.livedoor.jp/dankogai/archives/50430136.htmlを読んで考えてしまった。
つまり、こういうことだ。副作用がない関数であれば、return等というものは必要がない。値を返すのがメインなのだから、関数が終われば値を返すに決まっている。副作用がない関数で、かつunit(あるいはvoid)を返す関数と言うのは全くの無意味だ。実用上で存在価値はない。
更に言うなら副作用の無いOOPなどOOPでは無いと思う。少なくとも副作用が存在することは仮定して作ってある必要がある。この点が、おそらくHaskellオブジェクト指向になっていない理由なのじゃないかと思ったりしている。
で、CやらJavaScriptやらの言語でreturnが存在している理由としては、基本的に副作用があるからだろう。これが副作用が無ければ確かにreturnは余計に見える。それが、つまりλx.(x + 1)のような関数の場合だ。
しかしながら、もし仮にprint(x);x + 1というような関数だったらどうするか。printという副作用の後、突如出てくるx + 1という式。ここには是非ともreturnと書いておいて欲しい。
先ほどHaskellの例を出したけれども、Haskellのreturnは副作用も存在しうるMonadで使われる構文であると言うことを考えてみると、面白いんじゃないか、とも思った。