RSS

純粋関数型言語は使こなせるようにならなくても一度は試そう

最近ごにょごにょプログラムを書いていてなんとなく気持ちが悪く感じるコードに対して何故気持ち悪く感じるのだろうと考えた。でふと思い当たったのはHaskellをやったことだな,と。実際のところHaskellで実用アプリが作れるほど使いこんだわけではないがある程度の行数のプログラムは書いたことがある。その影響が自分のコード観に及ぼしているのだと。そのことはプログラムの構造に対して次の二点に注意しようということにまとめられる。

まず最初はコードは入力を出力に変換するものだとはっきりと作る。あたり前のようだが結構当たり前ではない。参照透過性を持った言語では入力が同じならば出力も同じである。ところが手続き型言語では状態を持つことで出力は一定でなくすことができる。そのことでこのコードは毎度何が起こるかわからない,そんな状態になる。あるところで設定したフラグが別のところで突然影響を与える。また変数の再代入も落とし穴だ。いつの間にか中身が変わっている。それでは読み解くのが難しくなる。長い関数だとしても受け取ったデータを加工して次の段階に渡す,その構造をはっきりさせることで問題が起きたときに調べなければならない部分が小さくなる。状態を持てないHaskellを使えばそういうコードは書き辛くなる。

もう一つは入出力の分離。IOは色々な所でおきる。コンソール・HTTP・DB・ファイルシステムあるいは高レベルのAPIなどなど…。IOが気楽にできるからと言ってあちこちに書くと大変なことになる。デバッグのときも大変だし,ユニットテストも書きにくくなる。そんなプログラムをHaskellで書けばIOモナドだらけになって見るからにひどいコードとなってしまうだろう。自然に入出力はできるだけまとめて書くようになる。

実際のところは他の言語では言語仕様の問題から関数型言語ぽく書こうとするとかえってややこしいことになるケースもある。しかしそれでも意識して書けばそれだけで自然にわかりやすいコードになると思う。ということで一度はHaskellをやったほうがその経験は他の言語で書く際にも役立つと思うのでお勧めである。