Haskellでゲームは作れるか

前日から東京にでっぱってたわりに、前日GHCの最新版がでたせいで、コンテスト直前朝5時までのすべての時間をつぎこんでゲーム作ってしまいました。このページからダウンロード

純粋関数型言語でゲームが作れるなんて想像もつきませんでしたが、やれば何とかなるものです。勢いでゲームを作っているうちにソースはどんどんアドホックに長くなり、しまいにはエンディングメッセージまで直接書き込んであるありさま。まだベーマガと呼ばれていた存在が息づいていた時代の記憶があざやかに蘇りました。

今回初めてHaskellでの関数型言語はゲームにも、とくに趣味でつくるゲームには向いているのかもしれない、という手ごたえをえることができました。


ご存知のとおり、純粋関数型言語Haskellではモナドをならべることで入出力というおもっきり副作用をともなう処理を扱いますが、IOモナドが並んでいるところは手続き型言語の一種にしか見えません。この前までc++OpenGL扱ってた経験がそのまんま生かせたくらいです。じゃあc++使えよ、というとそうでもなく
1 IOモナド(手続きの集まり)も第一級の対象で、あらゆる演算を施すことができる
2 型チェックしてるので実行時におちたりするようなバグが少ない
3 どうやって計算するか(手続き)ではなく、何を計算したいかをソースに書くので、誤ったアルゴリズムを書いてしまうレベルのバグも少ない
4 計算の構造も自由に作れる
5 プログラムのなかに構造をもったデータを書き込むことができる
などの利点があります。今回体験した利点をいくつか挙げれば・・・
4ですが3Dグラフィックをやってると何か視点とか変換行列とかを設定して描画して、描き終わったら元に戻すという計算をよくやりますが、Haskellだと"設定してなにかして戻すという構造"を表現してしまえるため、絶対に元に戻し忘れません。ギリシャの昔に理想とされていた、不正な物事は文法的に誤りになる言語みたいなもんです。あとcatchが平常文モナドとエラー処理文モナドの間の演算子として定義されているのは笑いました。5ですが、Basicのデータ文みたいなのは過去の遺物としても、ゲームのキャラの動きやステージデータなどは、ソースの中に書き込むと似たような行が多くなるし煩雑なので自前の言語をつくって外部ファイルにでも書いとくのが常識ですね。しかしHaskellはかなりの種類の構造をデータとともに自分で定義して持つことができます。