関数型言語でリアルタイムゲームは作れるのか?

関数型言語に関する話題はちょくちょく目にして、そのたびに素養として知っておくべきだろうなあと思ってはいるんだけど、今のところ思っているだけ。理由は簡単で、ゲーム作りに使えないから。

いや使えないというのは言いすぎだが、一般的に関数型言語でリアルタイムなゲームを作るというのは何か間違っているような印象があった。

一方、以下の種類のプログラムには向きません。書けないことはありませんが、他の言語で書いたほうが楽でしょう。また、Haskellでこれらのプログラムを書くと、手続き型言語で書いたのと同じようなコードが出来上がります。

  • 頻繁に IO を行うプログラム: IO などの不純な行為は Haskell は苦手。

にもあるように、関数型言語はIOが苦手というのが通説であり、IOの塊であるリアルタイムゲームとの相性は最悪だと考えていた。

ところがこんなのが出た。

どうしても2ch発祥っぽい響きなのがとても気になるが、それとは関係ない関数型言語Haskellで作られたグラディウスもどき。野心的すぎる。

ただ問題は、これが無理矢理関数型に落とし込んだものなのか、自然なスタイルで書くことができたものなのか、どっちなのかということだ。そんなものはコードを見れば分かる、と言いたいのだが、分からん。手続き脳にはあきれ返るほど分からん。

Haskellゲームエンジンも一応あるみたい。

We believe that Haskell is a great language to develop games, because of its high level of abstraction and the generation of a more concise, elegant and shorter code. This is great for code maintenance and understanding. Combining the power of Haskell with the facilities provided by game engines seems a promising project.

とか言っているけど、Example(http://www.cin.ufpe.br/~haskell/fungen/example.html)は'do'の下にずらずらと手続き的に処理が書かれていて、こりゃHaskellじゃなくてもいいんじゃねえのとか思う。あーでも'do'があるだけで手続きっぽいとか思うのは素人の発想なのかな。あと'findObject'とかいうのでオブジェクトの「ポインタ」みたいのを掴んでるのも気になるぞ。

こんくらいの規模だと分かりやすい。GameStateに全てのゲーム内状態が書いてあるので、それを毎フレームアップデートしているわけだ、と思う。分かりやすいとか言っといて自信なし。

でもやっぱり副作用がどうこうとか考えながら書くゲームプログラミングは相当つらそう。Haskellみたいに尖った関数型言語じゃなくて、OCamlくらいのおだやかな関数型言語を使ったほうがいいのか。

つうかこの辺をちゃんと考えるに当たって知っていなければならない前提知識多すぎ。勉強不足。いつになったら考え始める最初の資格が手に入るのやら。