2005年11月22日
_ 続関数型言語でゲーム
以前、関数型言語でゲームが作りにくいという話を しました。で、その問題をある程度解決する手段を思いついたので書いておきます。 以下のコードはCleanのコードです。
まず、なにが問題かというと、
// two records :: A1 = { x :: Real, y :: Real } :: A2 = { x :: Int, y :: Int, dx :: Int, dy :: Int }
という二つのレコード型がある場合、xというフィールド名がかぶっているので、 それにアクセスする場合、a.A1.xやb.A2.xと書く必要があるのが面倒であることです。 Haskellでは同じことをしようとするとコンパイル時にエラーがでますし、OCamlでは A1が使えなくなったりします。発生する現象は異なりますが根本的な問題は同じです。
そこで、型クラスを使い以下のような多重定義関数を作ります。
class x_ a b :: a -> b instance x_ A1 Real where x_ {A1| x} = x instance x_ A2 Int where x_ {A2| x} = x
すると、
x_ {A1| x=1.0, y=2.0}
や、
x_ {A2| x=3, y=4, dx=5, dy=6}
といったことができます。
型クラスの定義や多重定義関数の定義は数が増えた場合ソースコードジェネレータで 生成したほうが楽でしょう。
Haskellだと型クラスにいちいち名前を付けるぶん面倒が増えますが同じことができる でしょう。OCamlはこのまま適用はできないので G'Camlを使うか、 関数ローカルな空間に x_ のような関数を定義するといった方法をとる必要が あるでしょう。