トップ «前の日記(2005年11月21日) 最新 次の日記(2005年11月27日)» 編集

ohai日誌

2003|12|
2004|01|02|03|04|05|06|07|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|06|08|10|11|
2008|01|02|03|04|05|07|09|
2009|01|02|
2013|06|12|
2014|01|02|03|04|06|09|10|12|
2015|04|
2016|09|
2018|02|

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_ のような関数を定義するといった方法をとる必要が あるでしょう。

_ NF

明日から京大の学祭が始まります。KMCも展示をしています。私は何も作っていませんが。 お暇なら見にきてください。木曜の午前には会場にいる予定です。まあ平日の午前なんて いう時間帯ですが。


トップ «前の日記(2005年11月21日) 最新 次の日記(2005年11月27日)» 編集